Next: Sélecteurs (selector) Up: Objective C Previous: La portée des variables

La gestion des messages

En ObjectiveC les messages ne sont pas liés aux méthodes avant l'exécution. Le compilateur converti les messages, [receveur message] en un appel à la fonction, obi_msgSend(). Cette fonction prend le receveur et le nom de la méthode mentionné dans le message, le sélecteur (selector), comme ces deux arguments principaux:

objc_msgSend(receveur, selector) Tous les arguments du message sont aussi fournis à la fonction objc_msgSend():

objc_msgSend(receveur, selector, arg1, arg2, . . .)

Cette fonction de message fait le nécessaire pour le lien dynamique:

Remarque, c'est le compilateur qui créer les appels à la fonction de message. Vous ne devez jamais l'appeler directement dans le code que vous écrivez.

La clef du mécanisme de message se trouve dans les structure de donnée que le compilateur créé pour chaque classe et chaque objet. Chaque objet classe contient deux éléments essentiels:

A la création d'un objet, une zone mémoire est alloué pour le représenté, ses variables d'instances sont initialisées. La première de ces variables (définie dans Object) est un pointeur sur sa structure de classe. Ce pointeur isa donne à l'objet l'accès à sa classe, et par sa classe à toutes les classes dont il hérite.

Ces éléments des structure de classe et d'objet sont illustrés Figure 6.

Figure 6. Messagerie

Quand un message est envoyé à un objet, la fonction obi_msgSend() suit le pointeur isa de l'objet jusqu'a la structure de classe ou elle cherche le sélecteur dans la table d'indirection de classe. Si le sélecteur ne s'y trouve pas, la fonction obi_msgSend() suit le pointeur vers la superclasse où de nouveau elle recherche le sélecteur de la méthode. Les échecs successifs font que la fonction remonte la hiérarchie de super classes jusqu'à la classe Object, qui Elle, signale l'échec. Une fois que le sélecteur est localisé, elle appelle la fonction donnée par la table sur la structure de données de l'objet receveur.

Pour accélérer ces recherches, à chaque message le noyau d'exécution, enregistre les sélecteurs utilisés. En enregistrement est crée par classe, et il peut contenir à la fois les méthodes de la classe mais aussi les méthodes de la généalogie. Avant de recherche effectivement dans la table d'indirection, la fonction objc_msgSend() consulte ces enregistrements dans la classe de l'objet receveur (selon la théorie que si une méthode a été utilisé elle le sera de nouveau). Si le sélecteur est dans l'enregistrement, alors le message est presque aussi rapide qu'un appel de fonction. Une fois qu'un programme a tourné suffisamment longtemps presque tous les appels se feront par enregistrement. Ces enregistrements sont alloués dynamiquement pour accepter de nouveaux messages pendant l'exécution du programme.



Next: Sélecteurs (selector) Up: Objective C Previous: La portée des variables

Dominique REVUZ
Vendredi 21 février 1997 17:27:12
Une Bug Un mail Merci