2013-10-01 5 views
2

클래스 내부 및 외부에서 호출해야하는 함수가있는 클래스가 있습니다. 다음 코드는 잘 작동하지만 궁금한데 거기에 하나만있는 방법이 있나요? - 및 +가있는 두 메서드 대신 lowerKeyboard 메서드가 있습니까? 클래스 내에서 클래스예를 들어 동일한 메소드와 클래스 메소드. 가능한?

내부에서 메소드를 호출 할 때 나는 오류 unrecognized selector sent to instance를 얻을 수 있습니다 난 그냥 + 방법을하겠습니다 경우 클래스 외부에서

-(void)someOtherMethod 
{ 
    UIBarButtonItem *infoButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(lowerKeyboard)]; 
} 

:

[myClass lowerKeyboard]; 

myClass를

-(void)lowerKeyboard 
{ 
    //do something 

} 

+(void)lowerKeyboard 
{ 
     //do the exact same thing 
} 
+0

[클래스와 인스턴스 메서드의 차이점은 무엇입니까?] (http://stackoverflow.com/questions/1053592/what-is-the-difference-between-class-and-instance-methods) –

+0

@DavidCaunt 당신은 나쁜 것을 깨는 것에서 tod처럼 보입니다! 차이점을 묻지 않고, 차이점을 알고 있습니다. 내 질문은 두 가지를 결합하는 방법을 묻습니다. – Segev

+0

아니, 그는 나처럼 보입니다! –

답변

3

는 다음과 같은 말해봐 그러나

- (void)doFoo 
{ 
    [[self class] doFoo]; 
} 

+ (void)doFoo 
{ 
    NSLog(@"Do Foo!"); 
} 

, 그것은 지적 가치가 같은 두 개의 비슷한 이름의 방법을 가지고 문제를 요구하고있다. 혼란을 피하기 위해 두 인터페이스 중 하나를 제거하는 것이 훨씬 낫습니다 (특히 어쨌든 구현 사본 하나만 필요하기 때문에!).

나쁜 조언은 다음과 - 당신이 정말로 모른다면 실제로이 작업을 수행하지 않는 방법 런타임 엉망 (I는하지 않습니다.)

기술적으로, 당신은 클래스 구현 및 인스턴스 구현을 복제 할 수 있습니다에 과 같이 런타임을 편집하여 :

// Set this to the desired class: 
Class theClass = nil; 
IMP classImplementation = class_getImplementation(class_getClassMethod(theClass, @selector(doFoo))); 
class_replaceMethod(theClass, @selector(doFoo), classImplementation, NULL) 

이 확인해야합니다 + [하는 theClass가 doFoo] 전화를 호출하는 것과 정확히 같은 구현을 호출 - [하는 theClass doFoo]를. 클래스의 구현 스택에서 원본 인스턴스 구현을 완전히 제거합니다 (따라서 많은주의가 필요함). 그러나 그렇게하는 것에 대한 어떤 합법적 인 사례도 생각할 수 없기 때문에 이것을 소금 한 조각으로 대하십시오!

+0

선택기를 해당 메서드로 어떻게 설정할 수 있습니까? 그냥 다른 메서드로 설정해야하며 해당 메서드는 [[self class] doFoo]를 호출해야합니다. ? 선택기를 doFoo로 설정하면 여전히 인식되지 않는 선택자가 인스턴스로 전송됩니다. – Segev

+0

@ David David의 제안은이 "인식 할 수없는 선택기"를 피하기 위해 인스턴스 메소드가 있어야한다는 것입니다.클래스 메서드를 호출하는 인스턴스 메서드의 접근 방식이 코드의 첫 번째 방법이나 메서드의 런타임 대체 방법보다 훨씬 낫습니다. – Rob

+1

@DavidDoyle +1,하지만, 어떤 범죄도, 당신이'class_replaceMethod' 접근법을 제안하는 것조차 멈추지 않았 으면 좋겠다. 당신이 그것을 할 수 있다는 것이 학문적으로 흥미 롭지 만, 와우, 나는 동의합니다, 정말 나쁜 생각입니다! 롤 – Rob

0
-(void)lowerKeyboard 
{ 
    //this can be called on class instance 

    //UIBarButtonItem *infoButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(lowerKeyboard)]; 
    //[infoButtonItem lowerKeyboard]; 
} 

+(void)lowerKeyboard 
{ 
    //this can be used as class static method 
    //you cannot use any class properties here or "self" 

    //[UIBarButtonItem lowerKeyboard]; 
} 
모두 구현과 같이 할

- (void)doFoo 
{ 
    NSLog(@"Foo"); 
} 

+ (void)doFoo 
{ 
    NSLog(@"Foo"); 
} 

당신은 하나에이 리팩토링 할 수 있습니다 :