2009-06-28 6 views
3

Hé les gars, je cours le code suivant sur mon téléphone, où 'objet' est un chat, qui est une sous-classe de Animal. Animal a une propriété 'color':Utiliser NSMethodSignature sur iPhone (avec les propriétés 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]; 

La sortie dans ma console est:

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> 

Ensuite, je reçois l'erreur suivante:

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

Des indices? J'utilise cette méthode similaire dans d'autres classes, mais je n'arrive pas à comprendre ce que je fais de mal dans ce cas. La 'couleur' ​​du sélecteur existe évidemment, mais je ne sais pas pourquoi elle n'est pas correctement reconnue.

+2

"Animal a une propriété 'couleur' ​​..." J'aimerais beaucoup voir votre implémentation de cette propriété dans la sous-classe Seiche. :-) –

+1

Heureusement, Obj-C est un langage réflexif. : D –

Répondre

9

Essayez quelque chose comme ceci:

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

Vous manquait un appel à la méthode de setSelector:NSInvocation.

NSMethodSignature Les enregistrements saisissent des informations sur les arguments et la valeur de retour d'une méthode, mais ne contiennent pas le sélecteur lui-même. Donc, si vous voulez l'utiliser avec un NSInvocation, vous devez également définir le sélecteur d'invocation.

+0

Cela semble être ce qui manquait entre cette version et le code que j'utilisais dans une autre classe. Je l'avais remarqué au début, mais supposé que puisque le NSMethodSignature était instancié en utilisant le sélecteur, il serait en quelque sorte passé à l'invocation. (Si cela fonctionne, vous avez mon vote. :)) –

+0

Au lieu de '[invocation setSelector: sel];', vous pouvez également dire 'invocation.selector = sel;' –

+0

Mis à jour à la notation par points. –

Questions connexes