2009-04-12 4 views
9

내가 속성을 가진 간단한 프로토콜이 있습니다키 - 값은 프로토콜 개체에 관찰 : 컴파일러 경고를 addObserver에 :

@protocol StopsSource <NSObject> 
@property (retain,readonly) NSArray * stops; 
@end 

내가 다른 곳에서 변경을 듣고 키 - 값 관찰자를 추가 해요을 " 속성이 변경됩니다 "중지"는 점에서 예상대로 때

id<StopsSource> source = ... 
[source addObserver:self 
     forKeyPath:@"stops" 
      options:NSKeyValueObservingOptionNew 
      context:nil]; 

코드 내가 observeValueForKeyPath 이벤트를 가져 작품 속성을 "중지합니다. 'addObserver'메서드는 NSObject의에 범주에 정의되어

warning: '-addObserver:forKeyPath:options:context:' not found in protocol(s) 

:

@interface NSObject(NSKeyValueObserverRegistration) 

이 경고를 드롭 엑스 코드를 얻을 수있는 방법이 있나요 진짜 짜증은 addObserver 호출에서 컴파일러 경고입니다 ? 프로토콜이 카테고리를 채택 할 수 없다는 것을 이해하고 있으므로 NSKeyValueObserverRegistration 메소드를 내 프로토콜에 가져 오는 방법을 잘 모르겠습니다. 선언문을 프로토콜 자체에 복사하는 것보다는 해킹처럼 보입니다.

저는 이것이 컴파일러의 경고 일 뿐이라는 사소한 문제라는 것을 알고 있습니다 만,이 문제를 해결하는 "올바른"방법이 있는지 알고 싶습니다.

+2

참조 Abizern의 대답하지만, 특정 문제에 대한 , 'id '을 NSObject로 바꿉니다 * source = ... –

답변

12

진짜 짜증은 addObserver 호출에서 컴파일러 경고입니다 :

warning: '-addObserver:forKeyPath:options:context:' not found in protocol(s) 

'addObserver'메서드는 NSObject의에 범주에 정의되어

@interface NSObject(NSKeyValueObserverRegistration) 

XCode에서이 문제를 해결할 수있는 방법이 있습니까? 경고?

Xcode (소문자 C)는 경고 만 표시합니다. 컴파일러 인 GCC가 경고를줍니다.

당신은 프로토콜 NSObject의로 클래스 NSObject를 혼동하고 있습니다. NSObject 클래스는 NSObject 프로토콜을 따르지만, 프로토콜은 클래스와 자체 관계가 없습니다. 프로토콜 인 StopsSource 프로토콜은 NSObject 클래스가 아닌 NSObject 프로토콜을 상속받습니다.

귀하의 선언은 NSObject 클래스가 구현할 수있는 프로토콜 (예 : KVO) 이외의 어떤 것도 포함하지 않으므로이 두 프로토콜 만 포함하며 특정 클래스는 포함하지 않습니다. 그래서 경고를받는 것입니다.제이슨 코코 귀하의 질문에 대한 자신의 의견에 말했듯

는 솔루션은 NSObject의 클래스 플러스 프로토콜을 사용하는 선언을 변경하는 것입니다 :

NSObject <StopsSource> *source = …; 
중요한 정보에 대한
0

나는 프로토콜이하는 일에 대해 혼란스러워하고 있다고 생각합니다. 그것은 단지 다른 클래스에 의해 구현 될 수있는 일련의 연산을 정의합니다.

프로토콜에서 유일한 것은 속성입니다.

NSObject 프로토콜을 준수하도록 선언하는 이유는 무엇입니까? 프로토콜을 채택한 클래스가 있으면 NSObject에서 상속되므로 준수하게되므로이 작업을 수행 할 필요가 없습니다. 즉

@interface YourClass : NSObject <StopSource> { 
    // etc 
@end 
+0

프로토콜은 메소드 외에도 특성을 포함 할 수 있습니다. MyXMLSupport 프로토콜 예제는 을 참조하십시오. http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProtocols.html#//apple_ref/doc/uid/TP30001163-CH15-TPXREF148 –

+0

프로토콜은 종종 NSObject에서 확장되어 경고를 표시하지 않고 retain/release/respondsToSelector와 같은 NSObject 메소드에 응답합니다. 자세한 내용은 다음을 참조하십시오. http://stackoverflow.com/questions/679822/why-tack-a-protocol-of-nsobject-to-a-protocol-implementation –

+0

나는 점수를 볼 수 있지만 클래스에 생성해야 할 단일 속성 접근자를 위임과 같이 보이는 프로토콜을 채택해야합니다. – Abizern

관련 문제