2009-06-28 17 views
3

私の携帯電話で次のコードを実行しています。ここで、 'object'はAnimalのサブクラスであるCatです。動物は、プロパティ '色' を持つ:iPhoneでNSMethodSignatureを使用する(Obj-C 2.0のプロパティを使用)

NSLog(@"Object: %@", object); 
NSLog(@"Color: %@", [object color]); 
NSMethodSignature *signature = [[object class] instanceMethodSignatureForSelector:@selector(color)]; 

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; 
[invocation setTarget:object]; 

[invocation invoke]; 

私のコンソールの出力は次のとおりです。

その後
2009-06-28 16:17:07.766 MyApplication[57869:20b] Object: <Cat: 0xd3f370> 
2009-06-28 16:17:08.146 MyApplication[57869:20b] Color: <Color: 0xd3eae0> 

、私は次のエラーを取得する:

*** -[Cat <null selector>]: unrecognized selector sent to instance 0xd3f370 

任意の手がかり?私は他のクラスでこのようなメソッドを使用していますが、このインスタンスで何が間違っているのか分かりません。セレクタ 'color'は明らかに存在しますが、なぜそれが正しく認識されていないのかわかりません。あなたはNSInvocationsetSelector:メソッドの呼び出しを逃した

NSLog(@"Object: %@", object); 
NSLog(@"Color: %@", [object color]); 

SEL sel = @selector(color); 

NSMethodSignature *signature = [[object class] instanceMethodSignatureForSelector:sel]; 

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; 
invocation.selector = sel; 
invocation.target = object; 

[invocation invoke]; 

+2

"動物には 'color'というプロパティがあります..."私はこのプロパティの実装をCuttlefishサブクラスで見たいと思います。 :-) –

+1

幸いにも、Obj-Cは反射的言語です。 :D –

答えて

9

はこのような何かを試してみてください。

NSMethodSignatureメソッドの引数と戻り値の型情報を記録しますが、セレクタ自体は含みません。したがって、NSInvocationでそれを使用する場合は、呼び出しのセレクタも設定する必要があります。

+0

これは、このバージョンと別のクラスで使用していたコードとの間に欠けていたようです。私は実際にそれを最初に気づいていましたが、NSMethodSignatureがセレクタを使ってインスタンス化されていたので、何とか呼び出しに渡されると仮定しました。 (これがうまくいけば、あなたは私の投票を持っています:)) –

+0

'[invocation setSelector:sel];'の代わりに 'invocation.selector = sel;'と言うこともできます。 –

+0

ドット表記に更新されました。 –

関連する問題