上記の技術的な議論に加えて、答えは言語の歴史と構文よりも慣習に対するその好みに関連していると思います。正式なプロトコルは元々言語の一部ではありませんでした—すべてが非公式でした。その後、Appleは主に正式なプロトコルに移行しましたが、非公式のプロトコルは言語の一部であり、公式APIの一部で使用されています。したがって、これらは完全にサポートされている、Objective-Cのファーストクラスの部分です。
のドキュメントを見るNSArray
と、とりわけ次のように書かれています。
ほとんどの場合、カスタムNSArrayクラスはCocoaのオブジェクト所有権規則に準拠している必要があります。したがって、コレクションに追加する各オブジェクトに保持を送信し、コレクションから削除する各オブジェクトに解放する必要があります。もちろん、NSArrayをサブクラス化する理由が、標準とは異なるオブジェクト保持動作(たとえば、非保持配列)を実装するためである場合は、この要件を無視できます。
と:
NSArrayは、CoreFoundationの対応するCFArray[...]と「フリーダイヤルでブリッジ」されており、NSArrayでは簡単に実行できないことをCFArrayで実行できる場合があります。たとえば、CFArrayは一連のコールバックを提供し、その一部はカスタムの保持解放動作を実装するためのものです。これらのコールバックにNULL実装を指定すると、非保持配列を簡単に取得できます。
したがって、あなたの質問は誤った前提、具体的にはドキュメントの部分的な読み方または言語の不完全な考慮のいずれかに基づいています。
id <NSObject>
NSObject
プロトコルが、で使用できるようにオブジェクトが実装する必要のあるプロトコルと一致しないため、正しく使用されていませんNSArray
。代わりに、たまたまのサブセットである非公式のプロトコルがNSObject
ドキュメントで確立されています(ただし、2回目の非公式の削除ではまれです)。非公式のプロトコルはますます一般的ではありませんが、それらは有効であり、まだ例外ではありません。
したがって、私の答えの短いバージョンは次のとおりです。NSArray
非公式のプロトコルを文書化します。そのプロトコルはと同じではありませんNSObject
。非公式のプロトコルは構文で表されないため、id
。