Swift运行时知识讲解

309 阅读2分钟

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

相比较的优缺点

Objective-C 的动态派发(Runtime)和 Swift 的函数表派发(Table Dispatch)以及直接派发(Direct Dispatch)是这两种语言在方法调用机制上的主要差异。每种派发机制都有其特定的优点和缺点。

Objective-C 的动态派发(Runtime)

Objective-C 使用动态运行时(Runtime)来派发方法。这是一种动态的消息传递机制。

优点

  • 灵活性
  • :可以在运行时添加、修改或交换方法实现。
  • 动态特性
  • :支持像反射和类型检查这样的动态特性。
  • 动态绑定
  • :方法的实际实现可以在运行时决定,增加了代码的灵活性。

缺点

  • 性能开销
  • :动态查找方法实现比直接调用或间接调用(如虚函数表)要慢。
  • 复杂性
  • :动态特性可能导致代码难以预测和调试。

Swift 的函数表派发(Table Dispatch)

Swift 默认使用类似于 C++ 虚函数表的机制来派发类的方法。这种方式也被称为间接派发。

优点

  • 性能较好
  • :函数表派发比动态派发快,因为它只需要额外的一次内存访问(虚函数表查找)。
  • 类型安全
  • :Swift 的类型系统保证了调用的正确性。

缺点

  • 灵活性较低
  • :与 Objective-C 相比,Swift 的这种派发机制不支持像方法交换这样的动态特性。
  • 内存占用
  • :虚函数表增加了每个类的内存占用。

Swift 的直接派发(Direct Dispatch)

直接派发是 Swift 中最快的方法调用机制,常见于结构体、枚举和 final 标记的类方法。

优点

  • 性能最优
  • :由于编译器可以精确知道被调用的方法,因此可以进行内联等优化,减少调用开销。
  • 简单高效
  • :没有额外的运行时查找或决策过程。

缺点

  • 灵活性最低
  • :几乎没有动态特性,不支持像运行时方法替换这样的操作。
  • 扩展性有限
  • :由于编译时就已确定具体的方法实现,所以不能像虚函数表那样在子类中重写方法。

总结

Objective-C 的动态派发提供了极大的灵活性和动态特性,但以性能为代价。Swift 的函数表派发平衡了性能和灵活性,而直接派发则提供了最佳性能,但牺牲了灵活性。在实际开发中,选择哪种派发机制取决于特定场景的需求,例如对性能、灵活性或者特定语言特性的要求。