2009-04-12 14 views
9

私はプロパティを持つ単純なプロトコルがあります。キー値は、プロトコルオブジェクトに観察

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

を私が」への変更を聞くことが他の場所で、キーと値のオブザーバを追加しています「停止」プロパティ:

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

「停止」プロパティが変更されたときにobserveValueForKeyPathイベントが発生するという点で、コードは期待通りに機能します。本当の迷惑はaddObserverコールのコンパイラの警告です:

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

「addObserver」メソッドはNSObjectのにカテゴリに定義されています

@interface NSObject(NSKeyValueObserverRegistration) 

はXCodeのは、この警告をドロップするために取得する方法はあります?プロトコルがカテゴリを採用することはできないと私は理解しています。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など)の外側に何も含まれないように、2つのプロトコルのみをカバーします。だからあなたは警告を受ける。ジェイソンココがあなたの質問に彼のコメントにあなたに言ったよう

は、ソリューションは、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

プロトコルは、多くの場合、警告を出さずにretain/release/respondsToSelectorなどのNSObjectメソッドに応答するように、NSObjectから拡張されています。詳細については、 http://stackoverflow.com/questions/679822/why-tack-a-protocol-of-nsobject-to-a-protocol-implementation –

+0

私はあなたのポイントを見ますが、あなたがすべてこれは、プロトコルを採用するクラスで作成しなければならない単一のプロパティアクセサを強制することです。これは、オーバーコンプリートのようです。 – Abizern

関連する問題