내가 이런 종류의 코드가 호출방법 매개 변수, 프로토콜 방법, 대표 및 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
이 참을 반환하지 않는 이유는 무엇입니까?
'-respondsToSelector :'에 대한 호출이 FALSE를 반환하고 객체가 실렉터를 실제로 구현한다고 생각하면 어딘가에서 오해됩니다. 아마'self.delegate'는 당신이 생각한 대상이 아닙니다. 어쩌면 그것은 '전혀'아니다. 그것을 로깅 해보십시오. 아마도 장소 중 하나에서 메서드 이름의 철자가 틀린 것일 수 있습니다. 일반적으로'-respondsToSelector :'는 수신자의 선언 된 유형이나 실제 유형에 상관하지 않으며, 실제로 응답하는지 여부 만 테스트하기 때문에 프로토콜과 유형 선언에 관한 모든 내용은 부적합합니다. –
@KenThomases : 개체가 nil이 아니고, 디버깅 된 것이고, 이름이 괜찮습니다 ... 내가 무엇이 잘못 될 수 있는지를 안다. – Oliver
@KenThomases : 'self'를 억제했습니다. 내 코드에서 추출한 문제는 문제가 단순화되기 때문에 먼저 그 문제가 줄 지어있는 것처럼 보이지 않는 컴파일 문제입니다. " – Oliver