原文链接: (https://www.rightpoint.com/rplabs/switch-method-dispatch-table)[https://www.rightpoint.com/rplabs/switch-method-dispatch-table]
- 函数表派发 每个类当读维持一个函数表(Table Dispatch)
- 直接派发 (Direct Dispatch)
- 动态派发 (Dynamic Dispatch)
Direct Dispatch
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]
|
请发表评论