2011-11-27 22 views
5

私はスーパークラスは、メソッドAを実装して、私のサブクラスから、方法Aを実装している場合、私は安全に例外を得ることなく、私のサブクラスから[スーパーA]呼び出すことができるように、知ってほしいです。にはどうすれば見つけることができますか?

NSObjectののrespondsToSelectorは:(私のサブクラスが質問にメソッドを実装しているため)それは常にtrueを返しますので、この場合には動作しません。何か案は?

答えて

12

これを行うには、クラスメソッドinstancesRespondToSelector:を使用することができます。したがって、サブクラスから[[self superclass] instancesRespondToSelector:@selector(...)]を呼び出して、スーパークラスが必要なメソッドを実装しているかどうかを判断できます。

+0

クラスメソッドに相当するものは何ですか?クラスレベルのセレクタがスーパークラスかサブクラスかをテストしたいと思いますか? – jAckOdE

0

は[[[自己クラス]スーパー] instancesRespondToSelectorを:@selector(。)]お試しください]]

[スーパーrespondsToSelectorは:]おそらく現在のクラスのと同じである、respondsToSelectorのスーパークラスの実装を呼び出します。スーパークラスはメソッドを実装している場合にはないチェックを行います。それを実装するクラスをサブクラス化され、メソッドがサブクラスクラスのインスタンスで呼び出された場合[[self superclass] instancesRespondToSelector:@selector(...)]を呼び出す

2

は、動作しません。 1つの解決策は、それを実装する現在のクラスの名前を明示的に入力することです:

[[ExplicitClassName superclass] instancesRespondToSelector:@selector(...)]