Swift Method Dispatch

原文链接: (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

  • 静态派发

    • 优点: 函数位置确定,直接查找函数并执行具有最高效率
    • 缺点: 不具备动态性,无法通过子类继承
    • 例子
    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]

posted @ 2020-11-05 13:12  阿甘左  阅读(412)  评论(0编辑  收藏  举报