2009-09-28 9 views
1

C'est si simple que ça me rend fou de ne pas trouver de réponse.Comment une méthode Objective-C peut-elle faire référence à l'objet qui l'a appelée?

Comment une méthode peut-elle faire référence à l'instance qui l'a invoquée?

Exemple: dans une méthode d'alpha de classe, j'ai "[bravo charley]"

Je veux avoir la méthode charley faire "[delta alpha-exemple];" avec l'exemple particulier d'alpha qui a fait le "[bravo charley]". Mais Charlie ne sait rien de l'alpha ou de ses instances. En d'autres termes, comment puis-je obtenir une référence à l'instance alpha à partir de la méthode charley qui a été invoquée par une méthode dans l'instance alpha?

que je pouvais faire quelque chose comme

in bravo.h: 
    -(id) charley:(id)invoker; 
in alpha.m: 
    [bravo charley:self]; 

puis "[delta invocateur];" dans la méthode charley, mais cela semble plutôt moche.

Répondre

11

L'idiome commun pour accomplir ceci est de passer un paramètre appelé sender avec le message, plus ou moins comme dans votre exemple. C'est par exemple comment les méthodes liées en tant qu'actions de l'interface utilisateur sont spécifiées - par ex.

-(IBAction)doTheThing:(id)sender 

Il n'y a pas de façon intégrée d'obtenir l'objet qui a envoyé le message, et c'est très rarement nécessaire.

+0

Merci. Pas étonnant que je ne pouvais pas trouver un moyen intégré de le faire! –

1

Juste pour clarifier, une méthode ne peut pas toujours être invoquée par un autre objet, de sorte que le runtime ne serait pas capable de fournir de telles informations de manière fiable de toute façon. Par exemple,


int main (int argc, char *argv[]) 
{ 
    SEL releaserSel = @selector(release); 

    NSObject *someObject = [[NSObject alloc] init]; 

    IMP releaserImp = [someObject methodForSelector:releaserSel]; 

    releaserImp (someObject, releaserSel); 

    // someObject has been released! 
    return 0; 
} 

Ce n'est probablement pas aussi rare que vous le pensez. Invoquer une méthode directement est beaucoup plus rapide que d'envoyer un message (cela aide dans les situations où le même message est envoyé au même objet encore et encore).