2009-07-28 6 views

Répondre

3

L'IMP est un pointeur IMplementation, qui est essentiellement le crochet qui détermine ce qui sera exécuté à la réception d'un message (comme la longueur de foo). Vous n'avez généralement pas besoin d'eux, sauf si vous êtes en bas et sale; Il est généralement plus facile de gérer les sélecteurs.

6.1 Qu'est-ce qu'un IMP?

It's the C type of a method implementation pointer, a function 

pointeur à la fonction qui implémente une méthode Objective-C. Elle est définie revenir id et prend deux arguments cachés, l'auto et _cmd:

typedef id (*IMP)(id self,SEL _cmd,...); 

6.2 How do I get an IMP given a SEL ? 

    This can be done by sending a methodFor: message : 

IMP myImp = [myObject methodFor:mySel]; 

6.3 How do I send a message given an IMP ? 

    By dereferencing the function pointer. The following are all 
    equivalent : 

[myObject myMessage]; 

    or 

IMP myImp = [myObject methodFor:@selector(myMessage)]; 
myImp(myObject,@selector(myMessage)); 

    or 

[myObject perform:@selector(myMessage)]; 

De l'article 6.1 de la Objective C FAQ. En ce qui concerne le msgSend, vous invoquez un message distant sur un autre objet; objc_msgSend (foo, @ selector (bar)) est à peu près le même que [foo bar]. Mais ce sont tous des détails d'implémentation de bas niveau; vous avez rarement (ou jamais) besoin d'utiliser les appels étendus pour le code Objective C, puisque vous pouvez faire @selector pour obtenir une méthode et executerSelector: pour l'invoquer sur n'importe quel objet.