0

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

这是否意味着编译器必须通过添加调用它的类将消息显式更改为超级?

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

4

1 回答 1

0

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

因为类引用是固定常量,所以创建一个具有指定方法的类树并m在 D 对象上调用方法确实会执行 B 的实现,m尽管 D 不是 B 的子类。

于 2013-09-18T09:10:53.667 回答