2010-04-04 7 views
4

인스턴스가 특정 메소드를 구현하는지 알고 싶습니다. respondsToSelector:을 사용할 수 있지만 인스턴스가 메서드를 상속하는 경우 YES가 반환됩니다.인스턴스가 Objective-C에서 메서드를 구현하는지 여부를 어떻게 알 수 있습니까?

class_copyMethodList()의 메서드를 반복 할 수 있지만 많은 인스턴스를 확인하려고 할 수 있으므로 더 단순한 솔루션 (예 : repondsToSelector:, 클래스 자체에만 국한 됨 ...)

편집 : 실제로 기능이나 방법이 없다고 생각하기 때문에 광산을 썼다. 당신은 그렇게 reflection을 사용할 수 있습니다

+ (BOOL)class:(Class)aClass implementsSelector:(SEL)aSelector 
{ 
    Method   *methods; 
    unsigned int count; 
    unsigned int i; 

    methods = class_copyMethodList(aClass, &count); 
    BOOL implementsSelector = NO; 
    for (i = 0; i < count; i++) { 
     if (sel_isEqual(method_getName(methods[i]), aSelector)) { 
      implementsSelector = YES; 
      break; 
     } 
    } 
    free(methods); 
    return implementsSelector; 
} 
+1

자신의 수업에서이 작업을 수행하려는 경우 다른 tequniques가 복잡하고 성가신 디자인이므로 원하는 것을 알려주는 속성을 사용하는 것이 더 나은 디자인 패턴입니다. –

+0

메서드에서 메모리 누수가 발생했습니다. 당신은'자유 (방법);해야합니다, 그렇지 않으면 누출 될 것입니다. 이 문제를 해결하기 위해 수정 하겠지만 참고하시기 바랍니다. –

답변

1

: 그것은 어떤 사용이 될 수 있다면 감사합니다 귀하의 답변을, 여기에 방법이다.

+1

+1 +1 수퍼 클래스가 아닌 단일 클래스로 제한하는 다른 방법은 생각할 수 없다. –

+0

그래, 생각했지만 목록에있는 유일한 함수는 class_respondsToSelector()와 토론 부분은 respondsToSelector : 또는 instancesRespondToSelector : 둘 중 하나를 사용하는 것이 좋습니다 메서드를 상속하는 경우 둘 다 YES를 반환 그래서 반사 유일한 해결책은 class_copyMethodList()를 사용하는 것입니까? 아니면 설명서를 충분히 읽지 못했습니까? –

3

클래스가 반환하는 메소드가 슈퍼 클래스가 반환하는 메소드와 동일하거나 다른지 여부를 확인하는 것이 더 쉽습니다. 당신이 methodForSelector 전에 respondsToSelector를 호출해야합니다 애플의 문서에 따르면

-(BOOL) implementsSelector:(SEL)inSelector { 
    return [self respondsToSelector:inSelector] && !([super respondsToSelector:inSelector] && [self methodForSelector:inSelector] == [super methodForSelector:inSelector]); 
} 

:

if ([[obj class] instanceMethodForSelector:sel] != [[obj superclass] instanceMethodForSelector:sel]) { 
    NSLog(@"%@ directly implements %@", [obj class], NSStringFromSelector(sel)); 
} 
3

인스턴스는 응답 슈퍼하지 않습니다 :

-(BOOL) declaresSelector:(SEL)inSelector { 
    return [self respondsToSelector:inSelector] && ![super respondsToSelector:inSelector]; 
} 

인스턴스가 응답하고 슈퍼 다릅니다.

관련 문제