なぜiPhone SDKには、いくつかの代表団のために、というよりも、プロトコル、カテゴリを使用していますか?

StackOverflow https://stackoverflow.com/questions/900335

質問

私の理解では、プロトコルが他の言語でのインターフェイスのようであるということである - 彼らは期待メソッドを宣言 - (あなたが所有していないおそらくタイプ)カテゴリーでは、既存の型に新しいメソッドを追加することができながら、

なぜ、その後、iPhone SDKは時々、デリゲート型を宣言するためのカテゴリを使用していますか?通常、私は、すべての参加者は、ID 型付けされることを期待するだろうが、これが当てはまらない例が多います。

たとえば、NSURLConnectionを参照してください。そのデリゲートは、「ID」と「契約」がNSObjectの(NSURLConnectionDelegate)上のカテゴリとして宣言されて入力されます。

だから、:?これらのケースでカテゴリを使用する動機は何でしょう。

役に立ちましたか?

解決

のObjective-C 2.0を使用すると、任意であることが特定のプロトコルメソッドを宣言することができ、@optionalプロトコルディレクティブを導入しました。オブジェクト - C 2.0の前に、カテゴリは、オプションのデリゲートメソッド可能にするために使用した( 非公式プロトコルと呼ばれているNSObjectの上で具体的には、カテゴリ、)。

私の推測では、iPhone SDKでのカテゴリの代わり-のプロトコル使用のほとんどが同等のMacクラスからホールドオーバがあるということです。コードはおそらく共有されているので、例えば、NSURLConnectionは、MacとiPhoneのSDKの両方に存在します。 Appleはまだ正式なプロトコルを使用するようにMacのクラスのすべてを変更して行っておりませんので、我々は、やや矛盾のが残っています。

他のヒント

OS X 10.5および「Objective-Cの2.0」と呼ばれるiPhone SDK、でロールアウトしたのObjective-Cの改正までは、1はカテゴリのみを使用して、オプションのプロトコルを作ることができます。 Objective-Cの2.0では、新しい@optionalキーワードが(残りは暗黙的に要求される)任意たどの方法マークするプロトコルで添加した。

だから私は何を見ること@optionalキーワードの前に、以前の日からわずかホールドオーバーだと思います。

編集:元の質問に登場したフォローアップに答えるために:非公式のプロトコルにはNSObject / IDにカテゴリを使用する動機は、一部の文書とグループオブジェクトがそのデータソースに呼び出すことができますどのような方法(またはデリゲートにありますまたは何でも)、およびより少ない程度には、あなたはコンパイラが呼び出しを受けた対象で存在するであろう知らないメソッドを呼び出しているコンパイラの警告を避けるために。これらのデータソースのメソッドを呼び出すクラスを実装する1つのことを想像 - あなたはおそらく[respondsToSelector objを:@selector(私:データソース:メソッド:)]メソッドが使用して存在していることを確認したいと思うあなたが私を呼んで興味を持っている時はいつでも:データソース:メソッド:物体OBJ上の方法

これはレガシーがない「オプションのプロトコルメソッド」を持っていないObjective-Cの1.0から来たのです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top