Je sais que Objective-C utilise la liaison dynamique pour tous les appels de méthode. Comment cela est-il mis en œuvre? Est-ce que objective-c "se transforme en code C" avant la compilation et utilise simplement des pointeurs (void *) pour tout?Objective-C utilise la liaison dynamique, mais comment?
Répondre
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);
Ensuite, le runtime traite toutes les liaisons et répartitions, trouve une fonction appropriée et l'appelle avec ces arguments. Simplement, vous pouvez penser à cela comme une recherche de hachage; bien sûr, c'est beaucoup plus compliqué qu'en réalité.
Il y a beaucoup plus de problèmes liés à des choses comme les signatures de méthodes (C ne code pas les types, donc le runtime doit y faire face).
Chaque méthode Objective C est implémentée "sous le capot" en tant que (en effet) une fonction C. La méthode a un message (chaîne de texte) qui lui est associé, et la classe a une table de recherche qui correspond à la chaîne de message avec la fonction C. Ainsi, lorsque vous appelez une méthode Objective C, ce qui se passe réellement, c'est que vous envoyez une chaîne de message à l'objet et que l'objet recherche la fonction C associée dans la table de recherche de méthode de sa classe et l'exécute. Objective C ne se limite pas à Objective C, comme la façon dont les objets gèrent les messages qu'ils ne comprennent pas en les transférant, comment ils mettent en cache les recherches de message à méthode, etc., mais ce sont les bases. C++ est similaire, sauf qu'au lieu de la classe ayant une table de message, il a quelque chose d'autre appelé "vtable", et vous invoquez une méthode non via une chaîne de texte, mais via son offset dans la vtable. C'est une forme de liaison statique, qui accélère quelque peu l'exécution, mais qui est moins flexible que la liaison dynamique.
- 1. Allocation de mémoire dynamique 2D - ObjectiveC
- 2. comment configurer la liaison dynamique de libxml2?
- 3. Passage à la liaison dynamique
- 4. La liaison WCF -wsHttpBinding utilise une session?
- 5. Quelle est la différence entre la liaison dynamique C++ et la liaison dynamique Java?
- 6. Reliure ObjectiveC classe C# problème
- 7. Liaison statique et dynamique
- 8. Liaison dynamique AIX
- 9. liaison dynamique en Java
- 10. Liaison dynamique dans zOS
- 11. jQuery liaison d'événement dynamique
- 12. Envoi dynamique et liaison
- 13. Combine chaîne en ObjectiveC
- 14. Liaison dynamique d'images vectorielles xaml
- 15. La liaison dynamique est moins sécurisée?
- 16. dynamique Sql, problème avec la liaison
- 17. NSString question ObjectiveC
- 18. Liaison dynamique pour les paramètres?
- 19. Comment un conflit est résolu dans la liaison dynamique
- 20. comment C++ implémente la liaison dynamique en interne?
- 21. Ctypes Python et liaison dynamique
- 22. Liaison dynamique dans Visual Studio
- 23. Analyseur AMF0 dans ObjectiveC
- 24. MVC utilisé dans la programmation ObjectiveC
- 25. Liaison dynamique automatique au printemps
- 26. Silverlight - liaison dynamique d'un listbox.ItemTemplate
- 27. alloca et ObjectiveC Garbage Collector
- 28. Personnalisation de writeToFile dans ObjectiveC
- 29. Liaison de données dynamique à gridview
- 30. Liaison de valeur dynamique du composant JSF
L'exécution de l'objectif-c est open source, btw. Cela fait une lecture intéressante. objc_msgSend() est en fait un petit peu d'assemblage qui fait l'expédition en utilisant une optimisation de l'appel de queue pour éliminer le besoin de réécrire la trame de la pile lors de l'invocation. Tres rapide. – bbum