iOS Swift 运行时如何工作

How does iOS Swift Runtime work

ObjC中使用Messagingstatic bindingdynamic typingdynamic bindingdynamic method resolutiondynamic loading , introspector 等等。

重要的是,核心方法 objc_msgSend 负责获取您要发送的选择器和您要将其发送到的对象,并在 class 方法表中查找以计算确切地找出应该处理它的代码段。

我的顾虑是:

  1. Swift 是否在运行时做类似 ObjC 的事情?

  2. Swift runtime如何找到某些object/class方法的实现代码?

  3. ObjC中,classesobjects在运行时被编译成一些runtime types,例如C struct。那么 classesobjectsSwift 中在运行时编译成什么?

  4. Swift runtime有没有类似class / meta class / isa pointer / super pointer的东西?

简而言之,有动态和静态类型的方法调用调度。

  1. Static - 调用的函数地址在编译时就确定了,所以这种调用的开销和C函数调用差不多。此机制用于 private 方法或 final classes 方法调用调度。

  2. 动态调度是允许实现 OOP 的多态概念的机制 - 要调用的函数地址在 运行 时间内确定。 Swift 有两个子类型:

    2.1。 Obj-C - 你已经在问题中描述过。当对象继承自 NSObject 或调用方法有@objc 前缀时使用此机制。

    2.2。基于虚拟 table(就像在 C++ 中一样)- 有类似的见证 tables。它在方法调用调度期间所做的只是单个算术运算——根据基class见证table和对象class见证table中的函数偏移量计算实际函数地址地点。因此,与 Obj-C 相比,这是一个相对便宜的操作。它解释了为什么 "pure" Swift 接近 C++ 性能。

如果您不使用 private 关键字标记您的方法,或者您的 class 不是 final 而同时您的 class 是 "pure" Swift(它不继承 NSObject)然后使用这种基于虚拟 table 的机制。这意味着默认情况下所有方法都是virtual

P.S。 有助于 link 证明我对 "Types" 的看法:

https://developer.apple.com/swift/blog/?id=27

"Subtypes" 解释是基于我的理解。