2013-06-14 7 views
0

내가 이런 종류의 코드가 호출방법 매개 변수, 프로토콜 방법, 대표 및 respondsToSelector는

에서 MyClass.h

#import "MyOtherClass.h" 

@interface MyClass : NSObject<SomeProtocol, MyOtherClassDelegate> { 
... 
} 

MyClass.m

+ (void) doThis { 
    [someObject doThisWithDelegate:self]; // someObject is MyOtherClass type 
} 

MyOtherClass을 .h :

@protocol MyOtherClassDelegate <NSObject> 
@required 
// Some methods 
@end 

- (void) doThisWithDelegate:(id<SomeOtherProtocol>)delegate; 

MyOtherClass.m :

- (void) doThisWithDelegate:(id<SomeOtherProtocol>)delegate { 
    if ([delegate respondsToSelector:@selector(myProtocolMethod:error:)]) do things; 
} 

같이 이렇게, 나는이 컴파일시에서 다음 경고 : 라인 [someObject doThisWithDelegate:self];

"Incompatible pointer types sending Class to parameter of type id<SomeOtherProtocol>" 

에 MyOt의 메소드 선언 herClass.h : 나는 (id<SomeOtherProtocol>과)는 ID PARAM를 입력하지 않은

"Passing argument to parameter 'delegate' here" 

, 전에, 그것은 (id) 그냥 "혼자"였다. 나는 시험 것으로 나타났습니다 :

if ([delegate respondsToSelector:@selector(myProtocolMethod:error:)]) 

가 FALSE (그러나 물론 방법이 구현 및 위임에 선언되어있다) 돌아왔다.

그래서 id 유형을 강제로 컴파일하여 컴파일 할 때 해당 경고를 발생시키는 프로토콜을 준수하기로 결정했습니다.

여기 무슨 일입니까?
왜이 오류가 발생하며 respondsToSelector이 참을 반환하지 않는 이유는 무엇입니까?

+0

'-respondsToSelector :'에 대한 호출이 FALSE를 반환하고 객체가 실렉터를 실제로 구현한다고 생각하면 어딘가에서 오해됩니다. 아마'self.delegate'는 당신이 생각한 대상이 아닙니다. 어쩌면 그것은 '전혀'아니다. 그것을 로깅 해보십시오. 아마도 장소 중 하나에서 메서드 이름의 철자가 틀린 것일 수 있습니다. 일반적으로'-respondsToSelector :'는 수신자의 선언 된 유형이나 실제 유형에 상관하지 않으며, 실제로 응답하는지 여부 만 테스트하기 때문에 프로토콜과 유형 선언에 관한 모든 내용은 부적합합니다. –

+0

@KenThomases : 개체가 nil이 아니고, 디버깅 된 것이고, 이름이 괜찮습니다 ... 내가 무엇이 잘못 될 수 있는지를 안다. – Oliver

+0

@KenThomases : 'self'를 억제했습니다. 내 코드에서 추출한 문제는 문제가 단순화되기 때문에 먼저 그 문제가 줄 지어있는 것처럼 보이지 않는 컴파일 문제입니다. " – Oliver

답변

0

doThis 메서드를 인스턴스 메서드가 아닌 클래스 메서드로 선언했는데 문제가있었습니다. 따라서 self은 매개 변수로 전달할 때 유효하지 않습니다.

1

유형이 id<SomeProtocol> 인 자산에서 respondsToSelector:으로 전화하려면 해당 프로토콜이 NSObject 프로토콜을 준수하는지 확인하십시오.

예 :

if ([self.delegate respondsToSelector:@selector(myProtocolMethod:error:)]) { 
} 

delegate는 다음과 같이 정의되어 있다고 가정 :

@protocol SomeOtherProtocol <NSObject> 
// methods 
@end 

이것은 당신이 할 수

@property (nonatomic, weak) id<SomeOtherProtocol> delegate; 
+0

대리자가 @property (비 원자력, 약한) ID 위임으로 선언하는 이유는 respondsToSelector – Oliver

+0

질문을 편집 했으므로 이제 더 명확 해졌습니다. – Oliver

1

먼저 확인하십시오 당신은 respondsToSelector에 부합 NSObject의 일부입니다.

두 번째로는 대리인 속성을 효과적으로 설정했는지 확인합니다.

이 줄 : 오류 : 부동산 대리인이 myProtocolMethod을해야 객체를 가리키는 때문에

if ([self.delegate respondsToSelector:@selector(myProtocolMethod:error:)]) 

이 작동합니다 ....

은 아마 중단 점 또는으로 디버깅 것 대리자에 대한 세터에 테스트 :

-(void)setDelegate:(id)delegate 
{ 
NSLog("We are setting a delegate!: %@", [delegate description]); 
_delegate = delegate; 
} 

앱을 실행할 때, 당신은 "우리는 .... 설정"을 참조하면

당신이 당신의 경우 라인을하거나 후 전혀 표시되지 않는 경우, 그때 너는 문제가 어디에 있는지 알 수 있습니다.

+0

예, 대리인이 설정되고 프로토콜 및 대리인이 NSObject에 대한 좋은 참조를 가지고 있습니다. 이는 설정된 위임자이며 테스트 된 방법을 구현하고 있습니다. 메서드가 또한 선언되지 않습니다. 무엇이 잘못되었는지를 알 수 없습니다 ... – Oliver

+0

메서드 선언을 볼 수 있습니까? 그게 관련된 것일 수 있습니다. 내가 말했듯이, 코드가 작동해야합니다. @optional protocol methods에 대한 시간. –

+0

또한 "delegate"을 당신의 프로토콜에 맞추고 있는지 확인하십시오. (당신은 ... 그러나 ...) .h class에 declattion. –