2011-05-04 3 views
2

는 최근의 UITextField를 서브 클래 싱을 시도하고 (TI 내 문제를 해결하려고이 발견 : http://www.cocoabuilder.com/archive/cocoa/241465-iphone-why-can-a-uitextfield-be-its-own-delegate.html) 자신에게 위임 설정 무한 재귀의 인터페이스 결과에 정의 된 메소드를 호출대리인이있을 때 respondsToSelector는 어떻게 작동합니까?

@interface MyObject :UITextField <UITextFieldDelegate> 
@end 

@implementation MyObject 

-(id) initWithFrame:(CGRect) frame 
{ 
    if((self=[super initWithFrame:frame])) 
    { 
     self.delegate=self; 
    } 
    return self; 
} 

-(BOOL) respondsToSelector:(SEL)selector 
{ 
    NSLog(@"responds to selector"); 
    return [super respondsToSelector:selector]; 
} 

// Implement all the missing methods 
@end 

합니다. respondsToSelector가 델리게이트가있는 상태에서 어떻게 행동해야하는지 정의하는 Apple 문서에는 아무것도 표시되지 않습니다. 다음

+0

BTW, 나는 그냥 무한 재귀가 진행되고 있는지 확인하기 위해 respondsToSelector를 재정의하고 있습니다. – Megasaur

답변

5

docsrespondsToSelector에 대한 상태 :

객체 가 respondsToSelector를 전송하여 수퍼 클래스 에서하는 방법 상속 여부를 테스트 할 수 없습니다 다음 객체에 슈퍼 키워드를 사용합니다. [..] 그러므로 respondsToSelector : 을 super로 보내는 것은 을 자기에게 보내는 것과 같습니다.

이 당신의 재귀 문제의 원인이 될 수 있다고 보인다 객체의 슈퍼 클래스에 직접 :는 대신 NSObject의 클래스 메소드 instancesRespondToSelector를 호출해야합니다. 대리인 물건이 관련되어 있는지 여부는 알 수 없습니다. 그래도 추측.

+0

나는 이것을 보았다. 그러나 나는 그것이 모든 것을 설명한다고 생각하지 않습니다. 무한 재귀는 사용자가 대리인을 설정할 때 발생합니다. 따라서 대리자 메서드를 호출 한 사용자는 [obj.delegate respondsToSelector : @ (blah)]를 확인합니다. 그리고 obj.delegate는 obj입니다. 따라서 responsToSelector 구현은 델리게이트를 내부적으로 검사해야합니다. 하지만 이것이 표준 동작인지 또는 UITextField 고유 한 문서를 찾지 못했습니다 ... – Megasaur

관련 문제