-respondsToSelector:
に相当するクラスメソッドはありますか?
+respondsToSelector:
のようなものですか?
私が求めている理由は、クラスレベルで-respondsToSelector:
を実装することにより、コンパイラの警告が表示されるためです。
コードは次のようになります。
Class <SomeProtocol> someClass = [someInstance class];
if ([someClass respondsToSelector:@selector(someSelector:)]) {
someVar = [someClass someSelector:someData];
}
編集を見た後に更新する:
おそらくご存じのとおり、クラスオブジェクトはrespondsToSelector:
に正常に応答します。テストアプリケーションでは、コンパイラの警告なしで次の両方を実行できます。
NSLog(@"Responds to selector? %i", [MyObject respondsToSelector:@selector(respondsToSelector:)]);
NSLog(@"Responds to selector? %i", [[MyObject class] respondsToSelector:@selector(respondsToSelector:)]);
ただし、変数でプロトコルを宣言しているため、ポイントしているクラスオブジェクトがこれらのメソッドを実装していることを前提としています。最も簡単な解決策は、respondsToSelector:
を呼び出すために、someClass
をid
としてキャストすることです。ややクリーンなソリューションは、+respondsToSelector:(SEL)selector
を宣言する独自の@protocol
を宣言し、次のようにsomeClass
を宣言することです。
Class<SomeProtocol, ClassRespondingToSelector> someClass = ...
最後に、Apple at http://bugreporter.Apple.com でバグを報告してください。あなたが何であるかが非常に明確になるように、簡単なテストアプリケーションを含めてください。過去に提出された場合でも、修正の優先順位付けに役立つため、このようなバグレポートを歓迎します。
最後の注意:理論的には、NSObjectとは完全に別個のルートオブジェクトを実装することを選択できたため、これはおそらく発生しています。その場合、would n'tは-respondsToSelector:
に応答します。 -[NSObject respondsToSelector:]
は、クラス定義ではなく、NSObject
プロトコルで実際に宣言されています。 NSObject
プロトコルは、実際にNSObject
として知られているもののほとんどが実際に存在する場所です。 +respondsToSelector:
もそこにあるべきだと主張することもできますが、現時点ではそうではありません。また、プロトコルリストが提供されていて、メソッドがそこにないので、何をしているかを確認するための警告が表示されます。
クラスメソッドはクラスオブジェクトのメソッドであるため、これを行うことができるはずです。
[MyClass respondsToSelector:@selector(...)]
IOS 2.0以降では、次の_instancesRespondToSelector:
_を使用できます。そのため、クラスのインスタンスを使用すればどこでもできます。
_[myInstance respondsToSelector: @selector(...)];
_
クラスで使用できる
_[myClass instanceRespondsToSelector: @selector(...)];
// or
[[myInstance class] instanceRespondsToSelector: @selector(...)];
_
+(BOOL) respondsToSelector
のように動作します
あなたが求めていたと思うのは、クラスが+someMethod
に応答するかどうかを尋ねることはできますか?言い換えると、Cocoa Touch APIを考えると、次のようになります。
[ [ UIView class ] respondsToSelector: @selector( buttonWithType: ) ] -> NO
[ [ UIButton class ] respondsToSelector: @selector( buttonWithType: ) ] -> YES
しかし、私が上で書いたものは、期待通りに機能しません。 respondsToSelector:
はインスタンスメソッドのみに関するものです。 (したがって、両方の呼び出しはNOを返します。)Cocoa APIには、クラスのrespondsToSelector:
に相当するものはありません。
ただし、class_getClassMethod
を呼び出すことはできます。結果がNULLでない場合は、isについて問い合わせているクラスメソッドが存在し、それを呼び出すことができます。
Objective Cでは、クラスもオブジェクトなので、オブジェクトメッセージを送信できます。特に、-respondsToSelector:
のクラス。ただし、クラスレベルのメソッドを非クラスオブジェクトに送信することはできません。