2012-03-06 3 views
32

선택적 메서드를 사용하여 프로토콜을 구현했으며 메시지를 보내기 전에 호출 메서드에서 respondsToSelector:self.delegate으로 보내려고합니다. 그러나 컴파일되지 않습니다. 실패 메시지는 다음과 같습니다.self.delegate respondsToSelector : ... 컴파일되지 않았습니다.

아니요 'respondsToSelector'에 대한 알려진 인스턴스 메소드입니다. 컴파일 아래와 같이 해결 방법, 나는 "소독"대리자로서

...

//MyClass.h: 

@class MyClass; 

@Protocol MyClassDelegate 
- (void)myClass:(MyClass *)sender willDoSomething:(BOOL)animated; 
@end 

@interface MyClass : UIViewController 

@property (nonatomic, weak) id<MyClassDelegate> delegate; 

@end 

//MyClass.m: 

... 
@synthesize delegate = _delegate; 
... 

id sanitizedDelegate = self.delegate; //Hmmmm... why does this work? 

if ([sanitizedDelegate respondsToSelector:@selector(myClass:willDoSomething:)]) { 
    [self.delegate myClass:self willDoSomething:animated]; 
} 

.

this one을 포함한 여러 게시물을 확인했지만 컴파일 실패 문제에 답변하지 않았습니다.

또한, 다른 접근이 작동하지 않습니다 ...

[self delegate] 
//or 
_delegate 

는 사람이를 본 사람 또는 처리하는 더 좋은 방법을 조언 해 줄 수 있습니다?

IOS 5.0 (9A334), 엑스 코드 4.2.1 (4D502)

답변

95

-respondsToSelector:은 NSObject에 대한 방법입니다. 어느 당신의 id 대리인이 사실 NSObject라는 것을 가정하고 캐스팅을 :

[(NSObject*)self.delegate respondsToSelector:@selector(myClass:willDoSomething:)]

또는 더 나은, 대리인 명시 적으로 NSObject의합니다

@property (nonatomic, weak) NSObject<MyClassDelegate>* delegate;

을 또는 프로토콜이 될 수 있도록 NSObject의의 하위 프로토콜 :

@protocol MyClassDelegate <NSObject>

+10

Ka-ching ... 나는 문 # 3을 가져갈 것이다. – vmanjz

+0

NSObject가 작업 한 것처럼 위임을 선언했습니다. 감사합니다! – c0d3Junk13

14

은 기본적으로 당신은 컴파일러가 사람들이 사용할 수있는 유일한 방법이 있다고 가정 귀하의 대리인이 당신의 <MyClassDelegate> 프로토콜에 의해서만 제한되는 것을 말하고있다.

@Protocol MyClassDelegate <NSObject> 
- (void)myClass:(MyClass *)sender willDoSomething:(BOOL)animated; 
@end 

컴파일러가 당신의 프로토콜을 따르는 객체가 respondsToSelector:를 정의하는 <NSObject> 프로토콜을 준수 함을 알고 그 방법을 : 당신이해야 할 것은 프로토콜과 같이 <NSObject>을 확장해야합니다.

+1

그래, 코드 완성은 지금부터 같은 ... 표준 연습을 조언한다. – vmanjz

관련 문제