我想知道Objective C动态消息传递系统的典型(或至少是Apple)实现是如何实现的。如何在编译和运行时处理选择器,NSObject*
真正指出的是,在那里如何找到方法实现。
在C ++中,我们有虚函数;它们是如何实现的正式实现细节,但实际上VF表指针作为第一个数据成员几乎是给定的。我想知道是否有一种类似无处不在的方式来实现ObjC的类系统。
答案 0 :(得分:3)
查看最近的开发Mac上/usr/include/objc
中的标题,了解一些底层对象的详细信息。 (Apple已在新运行时更改了一些内容,但许多更改尚未发布。有关原始实现的详细信息可以在这些标题中找到,或者通过Google搜索“objective c runtime”。)一些亮点:对象是只是一个包含实例变量的结构。此结构中的第一个元素称为isa
,它只是指向类对象(或类对象的超类)的指针。类对象包含指定类中不同方法和变量的名称和位置的数据,运行时在查找方法时引用这些数据结构。一旦第一次查找了一个方法,它就会存储在一个表中,以便将来快速参考。
答案 1 :(得分:3)
这可能非常冗长。 ughoavgfhw的答案是一个好的开始。
我建议您阅读以下博文:
如果您不想深入研究源代码,objc可以使用clang和Apple’s Open Source Web site。
答案 2 :(得分:1)
Apple的官方Objective-C Runtime Reference记录了C库,它提供了Objective-C的所有调度,反射和其他面向对象的任务。所使用的大多数实际数据结构都是不透明的 - 我认为它们都是10.5以来 - 并且没有理由假设在1986年实现了连续的生产线。
编译器只是将Objective-C内容转换为对运行时的调用;你也可以自己调用它来获取你的方法的C函数指针之类的东西,然后你可以在没有正常开销的情况下调度它,但代价是一大堆其他机制不再工作。