2012-04-06 19 views
15

NSObjectプロトコルにはストックプロトコルテンプレートが付属していますが、プロトコルの実際の実装に必要なものすべてではないようです。それを残すことは、絶対に何も変えないようです。それで、プロトコルがそれを継承することが本当に必要なのでしょうか、それとも不必要なアドオンですか?必須プロトコルはNSObjectプロトコルに準拠していますか?

答えて

19

に準拠知らない

typedef struct objc_object { 
    Class isa; 
} *id; 

として定義されているのに対し、NSObject

@interface NSObject <NSObject> { 
    Class isa; 
} 

として定義されます私のプロトコルは<NSObject>に準拠していませんでした。それはうまく動作します。しかし、しばしば迷惑になることがあります。最も一般的な煩さはrespondsToSelector:NSObject*(プロトコルの全ポイントを敗北させる種類)にキャストせずに使用できないことです。それは@optionalがなかったのでObjC1の日には戻っていませんでしたので、私たちはそれについて心配していませんでした。(@optionalがないとプロトコルがあまり役に立ちませんでした。その後、ObjC2は、オプションのメソッドの素晴らしい追加と一緒に来て、突然respondsToSelector:が重要です。私たちのほうが遅かったのですが、プロトコルが<NSObject>に準拠するようにすれば、人生ははるかに簡単だったことがわかりました。幸いにも、これがXcodeに移行しました。これにより、誰もがより便利な方法で簡単に操作できるようになりました。

しかし、いいえ、あなたはそれをする必要はありません。多くの場合重要ではありません。しかし、それをしない理由はあまりないので、私はそれをお勧めします。

+0

偉大な答え...しかし、あなたはNSObjectプロトコルで言及している煩わさも 'id obj'で動くようになります。クラスを使ってオブジェクトを参照すると、コンパイラは継承を知るでしょう。おそらくNSObjectで始まります... –

6

必ずしもそうではありません。デリゲートは単なるヘルパーオブジェクトです。唯一の要件はデリゲートクラスが配置する要件です。特定のデリゲートの要件を正式化する場合は、正式なプロトコルを作成します。つまり、@protocolディレクティブを使用してプロトコルを宣言します。 NSObjectのプロトコルに準拠することは、これらの要件のいずれかである場合、あなたはあなたのプロトコルがそれを採用することができます:言っ

@protocol MyDelegateProtocol <NSObject> 
//... 
@end 

が、私はおそらくNSObjectのかNSProxyに由来していないデリゲートを作成するために、どのような理由が表示されません、これらのクラスはすでにNSObjectプロトコルに準拠しています。

+0

プロトコルがNSObjectに準拠していない場合、NSObjectから破棄された代理人は破棄できますか? (言い換えれば、デリゲートメソッドが呼び出されないため、一般的には適合しません)。 – CodaFi

+2

NSObjectはNSObjectプロトコルに準拠しているため、NSObjectから派生したクラスもNSObjectプロトコルに準拠しています。したがって、NSObjectから派生したデリゲートは、それが採用するデリゲートプロトコルがNSObjectプロトコルを明示的に採用していないため、破損しません。 – Caleb

1

すべてのオブジェクトがサブクラスNSObjectになっているわけではありませんので、そのようなオブジェクトがあなたのプロトコルに準拠することを期待していれば、必ずしもNSObjectに準拠する必要はありません。

NSObjectに準拠オブジェクトが基本に準拠していることをコンパイラに知らせてください。NSObject Protocol Referenceをチェックしてください。私はNSObjectに準拠しているとは言わずに、どのように私はこれに従っていることをコンパイラが知っていますか?

idがそうidため、コンパイラは、それがI(など長年にわたりNSObject

1

推奨事項であり、必須ではありません。 Appleの公式文書ProgrammingWithObjectiveC.pdfによる

それは上記で定義されていますようあなたがプロトコルに準拠ID にrespondsToSelector:メソッドを呼び出すしようとすると、コンパイラ エラーが発生しますそのための既知のインスタンスメソッドがないことを示します。 のIDをプロトコルに設定すると、すべてのタイプのチェックが戻ってきます。 指定されたプロトコルで定義されていないメソッドを呼び出そうとすると、 というエラーが発生します。コンパイラエラーを回避する1つの方法は、 カスタムプロトコルにNSObjectプロトコルを採用するように設定することです。

上記で定義されていますようなプロトコルは、NSObjectプロトコル適合せずプロトコルです。一例として、

それがNSObjectの行動の一部を別のプロトコルに そのクラスのインターフェースから分割された(NSObjectのプロトコルに に準拠するためにあなたのプロトコルを定義するのがベストプラクティスです。NSObjectクラス を採用NSObjectプロトコル)。

関連する問題