典型的目标C消息实现



我想知道Objective C动态消息传递系统的典型(或者至少是苹果的)实现看起来怎么样。选择器在编译和运行时是如何处理的,NSObject*真正指向的是什么,方法实现是如何在其中找到的。

在C++中,我们有虚拟函数;如何实现它们是官方的实现细节,但实际上,作为第一个数据成员的VF表指针几乎是既定的。我想知道是否有一种类似的普遍存在的方式来实现ObjC的类系统。

这可能很长。ughoavgfhw的回答是一个良好的开端。

我建议阅读以下博客文章:

  • bbum的objc_msgSend()教程第1、2、3、4部分
  • mikeash的星期五问答;A 2009-03-20:Objective-C消息

如果你不怕深入研究源代码,objc和clang可以在苹果的开源网站上找到。

查看最近的开发Mac上/usr/include/objc中的标题,了解一些底层对象的详细信息。(苹果在新的运行时中更改了一些内容,但许多更改尚未发布。有关原始实现的详细信息可以在这些标题中找到,也可以在谷歌上搜索"objective c runtime"。)一些亮点:对象只是一个包含实例变量的结构。该结构中的第一个元素称为isa,它只是指向类对象(或类对象的超类)的指针。类对象包含指定类中不同方法和变量的名称和位置的数据,运行时在查找方法时引用这些数据结构。一旦第一次查找了一个方法,它就会存储在一个表中,以便将来快速引用。

Apple官方的Objective-C Runtime Reference文档中的C库提供了Objective-C的所有分派、反射和其他面向对象任务。所使用的大多数实际数据结构都是不透明的——我认为所有这些都是从10.5开始的——没有理由假设1986年的实现是连续的。

编译器只是将Objective-C内容转换为对运行时的调用;您也可以自己调用它来获得指向方法的C函数指针之类的东西,然后您可以在没有正常开销的情况下将其调度到这些方法,尽管代价是一大堆其他机制不再工作。

最新更新