Swift Method Dispatch
- 函数表派发 每个类当读维持一个函数表(Table Dispatch)
- 直接派发 (Direct Dispatch)
- 动态派发 (Dynamic Dispatch)
Direct Dispatch
静态派发
- 优点: 函数位置确定,直接查找函数并执行具有最高效率
- 缺点: 不具备动态性,无法通过子类继承
- 例子
func static staticMethtodCall(){ ... }
Table Dispatch
- 通过一个函数表(
也称作 virtual table 或 witness table
),来记录某个类定义的函数 - 每个子类都有自己的表副本,对于类重写的每个方法都有不同的函数指针,新的方法会被追加到这个表后面
Message Dispatch
- 消息机制派发,swift通过构建继承树来实现super的的消息转发
Method Dispatch是如何决定的
通过以下四种条件来决定方法是如何派发
- 申明的位置, 全局函数,class中的函数,extension中的函数
- 引用的类型, class,protocol,继承于NSObject
- 行为
- 优化特性,函数的关键字,final,@objc,
在下面例子中
mainMethod
通过函数表派发,extensionMethod
直接派发class MyClass { func mainMethod() {}
}
extension MyClass {
func extensionMethod() {}
}派发的几种方式
- 值类型总是会直接派发,如Struct method
- Protocol在初始化的申明中是采用函数表派发,扩展中使用静态派发
- Class在初始化的申明中是采用函数表派发,扩展中使用静态派发
- 继承于NSObject的Class在初始化的申明中是采用函数表派发,扩展中使用消息派发
通过关键字指定派发的行为
几种派发方式对比
参考
(https://github.com/apple/swift)[https://github.com/apple/swift]