• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

SwiftMethodDispatch

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap