2011-07-29 15 views
1

タイプIDのオブジェクトでメソッドを呼び出そうとすると、メソッドが見つかりませんでした。もちろんではありませんが、idオブジェクトの感覚ではありませんか?タイプidのオブジェクトに対してメソッドを呼び出すとき

ですが、コンパイラに伝えるへの道:
「あなたは今、オブジェクトのクラスがどの私は、このメソッドを呼び出していませんが、心配しないで、それはそれを実装しない私は確信しています! "

答えて

8

メソッドを呼び出しますか?

そして、あなたがオブジェクト型idを持っている場合、それは同様respondsToSelectorを使用するために、おそらく良いアイデアです:)

すなわち

if ([myObject respondsToSelector:@selector(dosomething:)]) 
    myObject performSelector:@selector(doSomething:) withObject:@"hello"]; 
+0

メソッドがオブジェクト型の0〜2引数を取る場合にのみ機能します。メソッドが2つ以上の引数を取る場合、またはいずれかの引数がプリミティブ型である場合、それは機能しません。 –

+0

Fine、NSInvocationを見てください;) – deanWombourne

+0

これは私の状況(1引数、多くの潜在的な受信機の種類)に行く方法だと思います! – bijan

1

idオブジェクトは、それがわかっているクラスにキャストできます。

あなたはinstanceAという名前idインスタンスを持っていて、それがClassAであることがわかっている場合は、それに応じて

Class A *instanceACasted = (ClassA *)instanceA; 

それを唱えるその後、あなたはperformSelectorを使用することができ

[instanceACasted methodCall]; 
+0

うん、それは常に同じクラスではない:Objective-Cで、タイプidは、暗黙のうち任意のObjective-Cのオブジェクトポインタ型にキャストすることができます!実際には常にViewControllerのサブクラスなので、ViewControllerでそれをキャストできます。しかし、 "疎結合"の観点から、より良い方法はありませんか? – bijan

+0

if([instanceA isKindOfClass:[ClassA class]]){//キャストとメソッドの呼び出し}; –

+0

右のisKindOfClassも良い可能性があります。ありがとう! – bijan

4

はい、ちょうど適切なクラス型の変数を使用します。メッセージを送信するときに明示的なキャストを実行するか、正しいタイプの変数に割り当てることができます。

id myId = ...; 

// Option 1: Use a cast when sending the message 
[(MyClass *)myId someClassMethod]; 

// Option 2: Assign to a variable 
MyClass *myObj = miId; // Implicit cast in the assignment 
[myObj someClassMethod]; 
+0

ありがとう、やっと私は暗黙のキャスティングは何ですか:) – bijan

関連する問題