2011-01-14 13 views
5

私は非公式なプロトコルと実際のプロトコルに関するいくつかの基礎を学んでいます。私を混乱させるのは、ココアがNSObjectについて多くの非公式プロトコルを使用しているようだということです。それらの非公式プロトコルはメソッドを宣言するNSObjectのカテゴリですが、実際に実装しません。NSObjectで非公式プロトコルを使用する場合と、オプションの方法でプロトコルを使用する場合の違いは何ですか?

私が正しいと思う限り、彼らが非公式のプロトコル(つまり、メソッドの実装を提供しないNSObjectのカテゴリ)を利用する唯一の理由は、Xcodeにオートコンプリートヒントを与えることです。

NSObjectの非公式プロトコルであるNSNibLoading.hで定義されている-awakeFromNibメソッドの1つの例があります。ペン先ロードシステムは、オブジェクトがそのメソッドを実装しているかどうかを実行時にチェックします。そうであれば、それを呼び出します。

しかし、ここでは非公式プロトコルと呼ばれる機能はないと考えてみましょう。まったく同じ効果が得られる代替は、オプションのメソッド-awakeFromNibを宣言する実際の@protocol宣言でした。 NSObjectはそのプロトコルを採用するだけで、コンパイラは自動的にオートコンプリートを提供します。

誰もこの2つの戦略の大きな違いを指摘できますか?私は非公式なプロトコルのポイントを見ていないが、実際にそうしたいと思うだろう。

答えて

7

二つの大きな違い:

  1. コンパイル時の型チェック。任意のメソッドを持つ明示的なプロトコルは、実装可能なメソッドについてはっきりしています。どちらのクラスも明示的にプロトコルに準拠させるために、それも適合しています.Xcodeは実装可能なコード補完リストをより正確に提供することができます。

  2. NSObjectが整理されています。古いスタイルの非公式プロトコルでは、オプションであるすべてのメソッドは通常デフォルト実装NSObjectに追加しました。

Objective-C 2.0のプロトコルでオプションのメソッドを導入して以来、もはや存在しない問題に対するきちんとした解決策です。

+0

私は参照してください。非公式プロトコルは、オプションのプロトコルメソッドがない過去から来ています。今これは理にかなっています。 –

+0

私は、非公式のプロトコルが遺産の産物であることを明確に述べるように答えを更新しました。 – PeyloW

1

プロトコルを使用するためには、あなたがそれをインポートし、そしてあなたがコーディングされているオブジェクトが使用されるカテゴリのためには、それに

TestViewController : UIViewController <MyAwesomeProtocol> 

を適合させる必要があります、あなたがする必要はありませんそのようなことを行うには、カテゴリ(すべての場合に必要ではない)を単純にインポートして、あなたのようなオブジェクト(私の場合はUIViewController)を定期的に使用し、XCodeはカテゴリメソッドの自動補完を提供します。

私はプロトコルの方が好きです。より厳密で信頼性があります。カテゴリは建物の問題を引き起こす傾向があり、正直言って少し奇妙です(すべてではない)。

+0

どのような建物の問題ですか? –

+0

ライブラリーの組み合わせを使用したり、ライブラリーを自分でコンパイルしたりすることがあり、カテゴリーが壁になる傾向があります。私は現時点で明確な例はありませんが、カテゴリーのせいで3つのフレームワークがプロジェクトでこのような問題を引き起こしたことはわかっています。大ファンではありません。 – Jake

3

大きな違いは、@optionalというキーワードが数年前に導入されたことだけです。新しいコードの場合、非公式プロトコルは基本的には廃止されています。フレームワークの多くは非新規コードです。