Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS Swift运行时是如何工作的_Ios_Swift_Runtime - Fatal编程技术网

iOS Swift运行时是如何工作的

iOS Swift运行时是如何工作的,ios,swift,runtime,Ios,Swift,Runtime,在ObjC中,它使用消息传递,静态绑定,动态键入,动态绑定,动态方法解析,动态加载,内省等等 重要的是,核心方法objc_msgSend负责获取要发送的选择器和要发送到的对象,并在类方法表中查找该选择器,以确定应该由哪段代码来处理它 我关注的是: Swift是否在运行时执行类似于ObjC的操作 Swift运行时如何找到某些对象/类方法的实现代码 在ObjC中,类和对象被编译成一些运行时类型,例如运行时的C结构。那么在Swift中运行时编译到的类和对象是什么 Swift运行时是否具有类似于clas

ObjC
中,它使用
消息传递
静态绑定
动态键入
动态绑定
动态方法解析
动态加载
内省
等等

重要的是,核心方法objc_msgSend负责获取要发送的选择器和要发送到的对象,并在类方法表中查找该选择器,以确定应该由哪段代码来处理它

我关注的是:

  • Swift
    是否在运行时执行类似于
    ObjC
    的操作

  • Swift运行时
    如何找到某些对象/类方法的实现代码

  • ObjC
    中,
    对象
    被编译成一些
    运行时类型
    ,例如运行时的
    C结构
    。那么在
    Swift
    中运行时编译到的
    类和
    对象是什么

  • Swift运行时
    是否具有类似于
    class/meta class/isa指针/super指针的功能


  • 简言之,方法调用调度有动态和静态两种类型

  • 静态-要调用的函数地址在编译时确定,因此此类调用的费用与C函数调用类似。此机制用于
    private
    方法或
    final
    类方法调用调度

  • 动态调度是一种机制,它允许实现OOP的多态性概念——要调用的函数地址在运行时确定。Swift有两个子类型:

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

    2.2。基于虚拟表(如在C++中)-有类似的见证表。它在方法调用调度期间所做的只是一个算术运算——根据基类见证表和对象类见证表位置中的函数偏移量计算实际函数地址。与Obj-C相比,这是一个相对便宜的操作,它解释了为什么“纯”SWIFT近似于C++性能。 如果您没有用
    private
    关键字标记方法,或者您的类不是
    final
    ,同时您的类是“纯”Swift(它不继承NSObject),则使用这种基于虚拟表的机制。这意味着默认情况下所有方法都是
    virtual

    附言。 有助于证明我对“类型”的看法的链接:


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

    你能举个例子吗?@Boris我所回答的与#1和#2有关。关于#3和#4,我确信斯威夫特肯定有一些东西,但这并没有稳定下来。最初计划在Swift 3.0版本中稳定ABI,但飞机有所改变: