什么是Objective-C的msgSendSuper行为?

时间:2013-09-18 09:10:54

标签: objective-c

检查Apple的开源消息调度代码,我注意到对super的调用使用了一个包含实例的结构和一个应该从中找到超类方法的类。

这是否意味着编译器必须通过添加从中调用的类来显式地将消息更改为super?

给定一些类C树,其中C扩展B扩展A,并且它们都实现了调用m的方法[super m],并且我们在运行时创建D扩展A,抓住C的{{1}实现1}}用作D'; m实际上会调用所有D, B 和A的方法[d m],而不仅仅是D和A?

1 个答案:

答案 0 :(得分:0)

读取反汇编,编译器会将对super的调用更改为从固定列表加载类的地址,使用实例创建结构,并调用objc_msgSendSuper2

因为类引用是固定常量,所以使用指定的方法创建类树并在D对象上调用方法m将确实执行B的m实现,尽管D不是B的子类。 / p>