iOS Swift 运行时如何工作
How does iOS Swift Runtime work
在ObjC
中使用Messaging
、static binding
、dynamic typing
、dynamic binding
、dynamic method resolution
、dynamic loading
, introspector
等等。
重要的是,核心方法 objc_msgSend
负责获取您要发送的选择器和您要将其发送到的对象,并在 class 方法表中查找以计算确切地找出应该处理它的代码段。
我的顾虑是:
Swift
是否在运行时做类似 ObjC
的事情?
Swift runtime
如何找到某些object/class方法的实现代码?
在ObjC
中,classes
和objects
在运行时被编译成一些runtime types
,例如C struct
。那么 classes
和 objects
在 Swift
中在运行时编译成什么?
Swift runtime
有没有类似class / meta class / isa pointer / super pointer
的东西?
简而言之,有动态和静态类型的方法调用调度。
Static - 调用的函数地址在编译时就确定了,所以这种调用的开销和C函数调用差不多。此机制用于 private
方法或 final
classes 方法调用调度。
动态调度是允许实现 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" 解释是基于我的理解。
在ObjC
中使用Messaging
、static binding
、dynamic typing
、dynamic binding
、dynamic method resolution
、dynamic loading
, introspector
等等。
重要的是,核心方法 objc_msgSend
负责获取您要发送的选择器和您要将其发送到的对象,并在 class 方法表中查找以计算确切地找出应该处理它的代码段。
我的顾虑是:
Swift
是否在运行时做类似ObjC
的事情?Swift runtime
如何找到某些object/class方法的实现代码?在
ObjC
中,classes
和objects
在运行时被编译成一些runtime types
,例如C struct
。那么classes
和objects
在Swift
中在运行时编译成什么?Swift runtime
有没有类似class / meta class / isa pointer / super pointer
的东西?
简而言之,有动态和静态类型的方法调用调度。
Static - 调用的函数地址在编译时就确定了,所以这种调用的开销和C函数调用差不多。此机制用于
private
方法或final
classes 方法调用调度。动态调度是允许实现 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" 解释是基于我的理解。