2017-11-10 3 views
0

プログラム内に複数のオブジェクトがあり、メソッドAをクラスメソッド(+ (void)A)として実装するものもあれば、メンバ関数(- (void) A)として実装するものもあります。 respondToSelector:を使用して、Aが指定されたオブジェクトによってクラス対オブジェクトとしてサポートされているかどうかを調べるにはどうすればよいですか?メソッド "A"がクラス対インスタンスメソッドかどうかを検出しますか?

私はインスタンスを持っていない、私は[NSBundle classNames:name]を使って取得したクラスしか持っていない。今度は、クラスのメソッドAを単に呼び出すことができるかどうかを知りたい、またはクラスを最初にインスタンス化してからインスタンス上でAを呼び出す必要があります。

+2

あなたはクラスとオブジェクトでrespondsToSelectorを呼び出して、どのように動作するか見てみましたか? –

答えて

1
if ([[NSBundle classNamed:name] respondsToSelector:@selector(A)]){ 
    //Your class responds to the selector i.e. its a class method 
} else if ([[NSBundle classNamed:name] instancesRespondToSelector:@selector(A)]){ 
    //Your class' instances respond to the selector, i.e. its an instance method 
} 
+2

このコードはテキスト形式で展開できます。 – DiskJunky

4

メソッド/プロパティを使用してオブジェクトのクラスを問い合わせることができます。classクラスはオブジェクト(クラスClass)で表されます。他のオブジェクトと同様に、クラスオブジェクトはrespondsToSelector:メッセージを理解します。

if ([object respondsToSelector:@selector(A)]) { 
    [object A]; 
} else if ([object.class respondsToSelector:@selector(A)]) { 
    [object.class A]; 
} 

P.S.これはおそらく良いデザインではありません。たぶんクラスメソッドとしてではなく、どこでもインスタンスメソッドとしてAを実装するだけです。

+0

私はおそらく明確ではありませんでした。私はまだインスタンスを持っていない、私は[NSBundle classNames:name]を使って取得したクラスしか持っていない。今、クラスでAを呼び出すことができるかどうかを知りたい、またはクラスをインスタンス化してからインスタンスに対してAを呼び出す必要があります。 – sramij

関連する問題