2009-06-28 3 views
3

Hey Leute, ich führe den folgenden Code auf meinem Handy aus, wo "Objekt" eine Katze ist, die eine Unterklasse von Animal ist. Tier hat eine Eigenschaft 'Farbe':Verwenden von NSMethodSignature auf dem iPhone (mit Obj-C 2.0-Eigenschaften)

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

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

[invocation invoke]; 

Die Ausgabe in meiner Konsole ist:

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> 

Dann bekomme ich folgende Fehlermeldung:

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

Irgendwelche Hinweise? Ich verwende diese ähnliche Methode in anderen Klassen, aber ich kann nicht herausfinden, was ich in diesem Fall falsch mache. Die Auswahl "Farbe" existiert offensichtlich, aber ich weiß nicht, warum sie nicht richtig erkannt wird.

+2

"Tier hat eine Eigenschaft 'Farbe' ..." Ich würde sehr gerne Ihre Umsetzung dieser Eigenschaft in der Unterklasse Cuttlefish sehen. :-) –

+1

Glücklicherweise ist Obj-C eine reflektierende Sprache. : D –

Antwort

9

versuchen, etwas wie folgt aus:

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]; 

Sie wurden einen Aufruf an NSInvocation ‚s setSelector: Verfahren fehlt.

NSMethodSignature zeichnet Typinformationen für die Argumente und den Rückgabewert einer Methode auf, enthält jedoch nicht den Selektor. Also, wenn Sie es mit einem NSInvocation verwenden möchten, müssen Sie auch den Selektor des Aufrufs festlegen.

+0

Das scheint zu sein, was zwischen dieser Version und dem Code fehlte, den ich in einer anderen Klasse verwendete. Ich hatte es zuerst bemerkt, aber angenommen, dass, da die NSMethodSignature mit dem Selektor instanziiert wurde, sie irgendwie an den Aufruf übergeben würde. (Wenn das klappt, hast du meine Stimme. :)) –

+0

Statt '[invocation setSelector: sel];' kannst du auch 'invocation.selector = sel;' sagen. –

+0

In Punktnotation aktualisiert. –