1. OC 和 Swift 方法调度区别 - 476139183/Learning-iOS GitHub Wiki

1. 方法调度

1. OC 是 通过 runtime 进行方法查找

2. swift

  1. 结构体:静态调用(直接地址调用)
  2. 类:一般通过 V-Table 进行调度

3.如果 方法声明在 extension 中,那么 就变成了地址直接调用。

举个例子:在 Swift 中,一个类有子类,有 extension,extension 可以写在任意Swift文件中,如果子类所在文件优先于 extension 所在文件加载,子类的函数表会首先继承父类的函数表,其次是自己的函数列表,当加载到extension时发现有函数,这时子类中没有指针记录哪些是父类方法哪些是自己的方法,就没法将extension中的方法按顺序的插入自己的函数表中。

4. 汇编模式下可看出:dynamic 修饰的函数依然是通过 V-Table 函数表调用,表示可以动态修改。(dynamic 只能用于 可继承机制的 class )

但同时,会告诉编译器,这个方法可能被动态调用,需要将其添加到方法查找表中