web-dev-qa-db-ja.com

-respondsToSelectorと同等のクラスメソッド:

-respondsToSelector:に相当するクラスメソッドはありますか?

+respondsToSelector:のようなものですか?

私が求めている理由は、クラスレベルで-respondsToSelector:を実装することにより、コンパイラの警告が表示されるためです。

コードは次のようになります。

Class <SomeProtocol> someClass = [someInstance class];

if ([someClass respondsToSelector:@selector(someSelector:)]) {
    someVar = [someClass someSelector:someData];
}
67
firstresponder

編集を見た後に更新する:

おそらくご存じのとおり、クラスオブジェクトはrespondsToSelector:に正常に応答します。テストアプリケーションでは、コンパイラの警告なしで次の両方を実行できます。

NSLog(@"Responds to selector? %i", [MyObject respondsToSelector:@selector(respondsToSelector:)]);
NSLog(@"Responds to selector? %i", [[MyObject class] respondsToSelector:@selector(respondsToSelector:)]);

ただし、変数でプロトコルを宣言しているため、ポイントしているクラスオブジェクトがこれらのメソッドを実装していることを前提としています。最も簡単な解決策は、respondsToSelector:を呼び出すために、someClassidとしてキャストすることです。ややクリーンなソリューションは、+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:もそこにあるべきだと主張することもできますが、現時点ではそうではありません。また、プロトコルリストが提供されていて、メソッドがそこにないので、何をしているかを確認するための警告が表示されます。

83
BJ Homer

クラスメソッドはクラスオブジェクトのメソッドであるため、これを行うことができるはずです。

[MyClass respondsToSelector:@selector(...)]
9
newacct

IOS 2.0以降では、次の_instancesRespondToSelector:_を使用できます。そのため、クラスのインスタンスを使用すればどこでもできます。

_[myInstance respondsToSelector: @selector(...)];
_

クラスで使用できる

_[myClass instanceRespondsToSelector: @selector(...)];
// or
[[myInstance class] instanceRespondsToSelector: @selector(...)];
_

+(BOOL) respondsToSelectorのように動作します

5

あなたが求めていたと思うのは、クラスが+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について問い合わせているクラスメソッドが存在し、それを呼び出すことができます。

1
escouten

Objective Cでは、クラスもオブジェクトなので、オブジェクトメッセージを送信できます。特に、-respondsToSelector:のクラス。ただし、クラスレベルのメソッドを非クラスオブジェクトに送信することはできません。

0
SK9