2

NSObject追加のメソッドを使用してプロトコルのサブプロトコルを定義NSObjectし、そのプロトコルへの準拠を宣言するカテゴリを定義して実装すると、コンパイル時に警告が表示されます。コンパイラは、私のカテゴリがプロトコルNSObjectで宣言されたすべてのメソッドを実装していないと不平を言います。NSObject

なぜそうなのかわかりません。NSObjectクラスは(プロトコルに準拠していることを宣言<Foundation/NSObject.h>していNSObjectます(そして、冗長に、これらのメソッドを実装していることを宣言しています)-それで十分ではありませんか?

ここでの問題の原因は何ですか?

サンプル コード - これをコンパイルすると、NSObject (CategoryToImplementMyProtocol)実装に関する警告が表示されます。

@protocol MyProtocol <NSObject>
- (void)myMethod;
@end

@interface NSObject (CategoryToImplementMyProtocol) <MyProtocol>
@end

@implementation NSObject (CategoryToImplementMyProtocol)

- (void)myMethod 
{
    NSLog("A la peanut butter sandwiches!");
}

@end

これに対処するいくつかの質問を見つけましたが、すべての答えは「この回避策を実行してください!」というものでした。「これが問題の原因である」ということではありません(または、受け入れられているにもかかわらず、単に間違っています...)。私はこれを回避できることを知っています。失敗する理由を本当に理解したいです。

4

1 に答える 1

1

<NSObject>問題は、プロトコルの採用を再度宣言していることです。プロトコルが Objective-C で機能する方法 (良くも悪くも) は、カテゴリの実装は、そのインターフェイスで指定されているすべてのプロトコルを実装する必要があるということです。

さらに、プロトコルの適合性は、Objective-C では構造的ではなく名目上のものです。つまり、クラスが正しいメソッドに応答するだけでは、そのプロトコルを採用するのに十分ではありません。

編集:サンプルコードが変更されたようで、私の答えはもはや関係がないと思います。

于 2012-05-19T07:47:51.583 に答える