Question

Je sais que Objective-C utilise la liaison dynamique pour tous les appels de méthode. Comment cela est mis en œuvre? Est-objectif-c "se transformer en code C" avant la compilation et il suffit d'utiliser (void *) pour tout pointeurs?

Était-ce utile?

La solution

Conceptuellement, ce qui se passe est qu'il ya une bibliothèque répartiteur (communément appelé l'objectif d'exécution C), et le compilateur convertit quelque chose comme ceci:

[myObject myMethodWithArg:a andArg:b ];

dans

//Not exactly correct, but close enough for this
objc_msgSend(myObject, "myMethodWithArg:andArg:", a, b);

Et puis les traite d'exécution avec toute la liaison et l'expédition, trouve une fonction appropriée, et il appelle avec ces args. Vous pouvez penser Simpliste cela comme une sorte de recherche de hachage; Bien sûr, il est beaucoup plus compliqué que alors dans la réalité.

Il y a beaucoup plus de problèmes liés à des choses comme les signatures de méthode (C ne code pas pour les types de sorte que le besoin d'exécution pour y faire face).

Autres conseils

Chaque méthode Objective C est mis en oeuvre « sous le capot », comme (en fait) une fonction C. La méthode a un message (chaîne de texte) associé, et la classe a une table de recherche qui correspond à la chaîne de message avec la fonction C. Donc, lorsque vous appelez une méthode objective C, ce qui est vraiment qui se passe est que vous envoyez une chaîne de message à l'objet, et l'objet recherche la fonction associée C dans sa méthode de classe de table de consultation et fonctionne que.

Il y a plus à avec Objective C, comme la façon dont les messages gèrent les objets qu'ils ne comprennent pas en les transférant, comment ils cache message à lookups méthode, et ainsi de suite, mais c'est l'essentiel.

C ++ est similaire, sauf au lieu de la classe ayant une table de message, il a quelque chose appelé un autre « vtable », et vous invoquer une méthode non par une chaîne de texte, mais par son décalage dans le vtable. Ceci est une forme de liaison statique, et accélère l'exécution un peu, mais est moins flexible que la liaison dynamique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top