典型的Objective C消息实现

问题描述

| 我想知道Objective C动态消息传递系统的典型(或至少是Apple的)实现的样子。选择器在编译和运行时如何处理,,0真正指向什么,如何在其中找到方法实现。 在C ++中,我们具有虚函数;如何实现它们在官方上是实现细节,但实际上,VF表指针作为第一个数据成员几乎是已知的。我想知道是否有类似的普遍方式来实现ObjC的类系统。     

解决方法

这可能会很长。 ughoavgfhw的答案是一个好的开始。 我建议阅读以下博客文章: bbum的objc_msgSend()导览部分1,2,3,4 mikeash的星期五问答2009-03-20:Objective-C消息传递 而且,如果您不害怕研究源代码,可以在Apple的开放源代码网站上找到objc和clang。     ,在您最近的Mac开发平台上的ѭ1中检出标题,了解一些底层对象的详细信息。 (Apple在新的运行时中进行了一些更改,但是许多更改尚未发布。有关原始实现的详细信息,可以在这些标题中找到,也可以通过搜索“目标c运行时”来找到。)一些重点:对象只是包含实例变量的结构。此结构中的第一个元素称为
isa
,它只是指向类对象(或类对象的超类)的指针。类对象包含指定类中不同方法和变量的名称和位置的数据,并且运行时在查找方法时会引用这些数据结构。首次查找方法后,该方法将存储在表中以供将来快速参考。     ,Apple的官方Objective-C运行时参考记录了C库,该库提供了Objective-C的所有分派,反射和其他面向对象的任务。使用的大多数实际数据结构都是不透明的-我想所有的数据结构都是从10.5开始的-并且没有理由假定可以追溯到1986年的连续生产线。 编译器只是将您的Objective-C内容转换为对运行时的调用。您还可以自己调用它,以获取指向您的方法的C函数指针之类的东西,然后您就可以分派它们,而不会产生通常的开销,尽管这是以其他许多机制不再起作用为代价的。