문제

클래스를 위해 작성하는 카테고리에 프로토콜이 설정 한 계약을 충족하는 메소드를 추가하는 경우 해당 카테고리 클래스를 프로토콜 구현으로 표시하고 OBJ-C 사전 프로세서에 클래스는 프로토콜을 효과적으로 구현합니다.

예제 대의원 (명확성, 감사합니다 Ole!) :

@protocol SomeDelegate <NSObject>
  - (void)someDelegateMessage;
@end

예제 카테고리 :

@interface NSObject (SomeCategory) <SomeDelegate>
  - (void)someDelegateMessage;    
@end

그리고 다른 일반적인 구현으로

@implement NSObject (SomeCategory)
  - (void)someDelegateMessage {}
@end

실제로 이것을 시도하면 각 nsobject 메소드에 대해 경고를받습니다.

경고 : 불완전한 범주 'SomeCategory'구현

경고 : '-description'에 대한 메소드 정의를 찾을 수 없습니다.

...

경고 : '-isequal :'찾을 수 없음에 대한 메소드 정의

경고 : 카테고리 'SomeCategory'

제거하면 잘 작동합니다 <SomeDelegate> 선언에서 나오지만 물론 NSOBJECT는 서도적으로 인식되지 않습니다.

도움이 되었습니까?

해결책

해결 방법은 구현이없는 카테고리에서 프로토콜을 선언하고 다른 범주에서 메소드를 구현하는 것입니다.

@interface NSObject (SomeCategory) <SomeDelegate>
  - (void)someDelegateMessage;    
@end

@implementation NSObject (SomeCategory_Impl)
  - (void)someDelegateMessage {}
@end

이렇게하면 NSObject 일치하는 것으로 간주됩니다 <SomeDelegate> 컴파일 타임 및 런타임 확인 someDelegateMessage 성공할 것입니다. 하지만, conformsToProtocol: 런타임 확인이 실패합니다.

물론, 당신은해야합니다 버그를 제출하십시오 핵심 클래스에서 선언 된 방법을 요청하면 경고가 발생하지 않습니다.

다른 팁

프로토콜 선언에 포함 가능합니다 NSObject 규약? 이와 같이:

@protocol SomeDelegate <NSObject>
...

그곳에서 경고가 나오는 곳입니다. 이제 귀하의 카테고리가 전체 프로토콜을 구현하지 않기 때문입니다. 방금 입력 한 테스트 코드에서 제거 NSObject 프로토콜에서 컴파일러 경고가 제거됩니다.

컴파일러가 전송에 대해 닥치기를 원한다면u003CNSObject> 메시지 (그리고 클래스 이름이 아닌 프로토콜 이름이라는 것을 기억하는 것이 중요합니다) 그런 다음 컴파일러에게 명시 적으로 말하는 'ID'변수를 사용합니다. .

또는 nsObject를 대신 변수 유형으로 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top