3

これは、簡単な例で最も簡単に説明できます。次のプロトコルとクラスの定義があるとします。

@protocol ProtocolA <NSObject>
@optional
+ (BOOL)methodA;
@end

@interface ClassA : NSObject <ProtocolA>
@end

ClassAを定義する場合と定義しない場合がありますmethodAClassAのインスタンスとインスタンス メソッドを使用していた場合、インスタンスを でテストできますrespondsToSelector:ClassAただし、この状況では、が定義 (応答)するかどうかを判断するための明確な方法は考えられませんmethodA

編集: 私はばかげていて、私の例を十分に具体的にしていませんでした。つまり、質問に対する答えが私の問題の解決策ではないことを意味していました。そのため、もう少しコードと私が得ている警告を含めています:

Class <ProtocolA> classRef = [ClassA class];

if([classRef respondsToSelector:@selector(methodA)]) {}

上記のコードは、次の警告をスローします: 「respondsToSelector:クラス メソッド ' respondsToSelector:' の代わりにインスタンス メソッド ' ' が見つかりました」

classRef明示的にキャストする(Class)と、警告が消えることに気付きました。私はまだそれが奇妙だと思います。

4

1 に答える 1

7

[[instance class] respondsToSelector:@selector(methodA)]

クラスのすべてのインスタンスには、 を呼び出すことで取得できるクラス オブジェクトへのポインタがありますclass。このオブジェクト (Objective C ではクラスはオブジェクトです) はrespondsToSelector:、他のオブジェクトと同様に調べることができます。

于 2013-04-10T01:42:56.790 に答える