NSObject プロトコルにはストック プロトコル テンプレートが付属していますが、プロトコルの実際の実装に必要なものはそれだけではないようです。それを放置しても、まったく何も変わらないようです。では、プロトコルがそれを継承することは本当に必要なのでしょうか?それとも単に不要なアドオンなのでしょうか?
4 に答える
何年もの間、私 (そして私のような多くの人) は、プロトコルを に準拠させていませんでした<NSObject>
。それは正常に動作します。しかし、それはしばしば迷惑になることがあります。最も一般的な煩わしさは、respondsToSelector:
キャストバックなしでは使用できないことですNSObject*
(これは、プロトコルの要点全体を無効にします)。ObjC1 の時代にはそれは問題ではなかった@optional
ので、@optional
. その後、ObjC2 はオプションのメソッドの素晴らしい追加とともに登場し、突然重要になりrespondsToSelector:
ました。遅い私たちには少し時間がかかりました.<NSObject>
. 幸いなことに、これが Xcode に組み込まれるようになり、誰もがより便利な方法で物事を簡単に実行できるようになりました。
しかし、いいえ、あなたはそれをする必要はありません。多くの場合、それは問題ではありません。でも、やらない理由はあまりないのでオススメです。
必ずしも。デリゲートは単なるヘルパー オブジェクトです。唯一の要件は、デリゲートするクラスがそれに課すものです。特定のデリゲートの要件を形式化する場合は、正式なプロトコルを作成します。つまり、@protocol
ディレクティブを使用してプロトコルを宣言します。NSObject プロトコルへの準拠がこれらの要件の 1 つである場合は、プロトコルにそれを採用させることができます。
@protocol MyDelegateProtocol <NSObject>
//...
@end
そうは言っても、NSObject やおそらく NSProxy から派生していないデリゲートを作成する理由は見当たらず、これらのクラスは両方とも NSObject プロトコルに既に準拠しています。
すべてのオブジェクトがサブクラス化NSObject
する必要があるわけではないので、そのようなオブジェクトがプロトコルに準拠することを期待していた場合、必ずしも NSObject に準拠する必要はないと思います。
NSObject に準拠することで、オブジェクトが基本に準拠していることをコンパイラに認識させます - NSObject Protocol Referenceを確認してください。私が NSObject に準拠していることは言うまでもありませんが、コンパイラは私がこれに準拠していることをどのように認識していますか?
NSObject
と定義されている
@interface NSObject <NSObject> {
Class isa;
}
一方、id
は次のように定義されます
typedef struct objc_object {
Class isa;
} *id;
したがってid
、コンパイラはそれが準拠していることを知りませんNSObject