iOS Swift Runtime如何工作

时间:2016-05-19 06:20:33

标签: ios swift runtime

ObjC中,它正在使用Messagingstatic bindingdynamic typingdynamic bindingdynamic method resolutiondynamic loading,{ {1}}等等。

重要的是,核心方法introspector负责获取您正在发送的选择器以及您要将其发送到的对象,并在类方法表中查找以确切地确定哪一段代码应该处理它。

我的担忧是:

  1. objc_msgSend是否在运行时执行类似Swift的操作?

  2. ObjC如何找到某个对象/类方法的实现代码?

  3. Swift runtime中,ObjCclasses在运行时被编译为某些objects,例如runtime types。那么在C struct中运行时编译的classesobjects是什么?

  4. Swift是否有Swift runtime

1 个答案:

答案 0 :(得分:24)

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

  1. 静态 - 要调用的函数地址在编译时确定,因此这种调用的开销类似于C函数调用。此机制用于private方法或final类方法调用调度。

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

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

    2.2。基于虚拟表(如在C ++中) - 有类似的见证表。它在方法调用调度期间所做的只是单个算术运算 - 基于基类见证表中的函数偏移和对象类见证表位置计算实际函数地址。因此,与Obj-C相比,这是一个相对便宜的操作。它解释了为什么“纯粹的”Swift与C ++性能近似。

  3. 如果你没有使用private关键字标记方法,或者你的类不是final,同时你的类是“纯”Swift(它不继承NSObject)那么基于这个虚拟表使用机制。这意味着默认情况下所有方法都是virtual

    P.S。 有助于证明我对“类型”的看法:

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

    “子类型”的解释是基于我的理解。