在ObjC
中,它正在使用Messaging
,static binding
,dynamic typing
,dynamic binding
,dynamic method resolution
,dynamic loading
,{ {1}}等等。
重要的是,核心方法introspector
负责获取您正在发送的选择器以及您要将其发送到的对象,并在类方法表中查找以确切地确定哪一段代码应该处理它。
我的担忧是:
objc_msgSend
是否在运行时执行类似Swift
的操作?
ObjC
如何找到某个对象/类方法的实现代码?
在Swift runtime
中,ObjC
和classes
在运行时被编译为某些objects
,例如runtime types
。那么在C struct
中运行时编译的classes
和objects
是什么?
Swift
是否有Swift runtime
?
答案 0 :(得分:24)
简而言之,有方法调用的动态和静态类型。
静态 - 要调用的函数地址在编译时确定,因此这种调用的开销类似于C函数调用。此机制用于private
方法或final
类方法调用调度。
动态调度是允许实现OOP的多态概念的机制 - 要调用的函数地址在运行时确定。 Swift有两种子类型:
2.1。 Obj-C - 您已在问题中描述过。当对象继承自NSObject或调用方法具有@objc前缀时,使用此机制。
2.2。基于虚拟表(如在C ++中) - 有类似的见证表。它在方法调用调度期间所做的只是单个算术运算 - 基于基类见证表中的函数偏移和对象类见证表位置计算实际函数地址。因此,与Obj-C相比,这是一个相对便宜的操作。它解释了为什么“纯粹的”Swift与C ++性能近似。
如果你没有使用private
关键字标记方法,或者你的类不是final
,同时你的类是“纯”Swift(它不继承NSObject)那么基于这个虚拟表使用机制。这意味着默认情况下所有方法都是virtual
。
P.S。 有助于证明我对“类型”的看法:
https://developer.apple.com/swift/blog/?id=27
“子类型”的解释是基于我的理解。