swift进阶(四)闭包底层探索

Swift进阶文章汇总

在文章swift进阶(四)闭包的使用介绍了闭包的使用,那么闭包底层是什么样的呢?那今天让我们探究一番。

1. 闭包捕获上下文

先看以下代码打印的值应该是多少?

func makeIncrementer() -> () -> Int {
   
    var runningTotal = 10
    func incrementer() -> Int {
   
        runningTotal += 1
        return runningTotal
    }
    return incrementer
}

let makeInc = makeIncrementer()
print(makeInc())
print(makeInc())
print(makeInc())
print("==========================")
print(makeIncrementer()())
print(makeIncrementer()())
print(makeIncrementer()())

打印结果如下:
swift进阶(四)闭包底层探索_第1张图片

查看SIL源码

  • 执行swiftc -emit-sil main.swift >> ./main.sil && code main.sil,生成sil文件

    • 在sil文件中查看makeIncrementer()方法,会发下alloc_box的地址赋值给了runningTotal变量。其中alloc_box是在堆上开辟空间。

    • 获取变量时,通过project_box在堆上取出来

    • 在闭包引用前,执行了retain操作

    • 在闭包引用后,执行了release操作

swift进阶(四)闭包底层探索_第2张图片

小结

  • 闭包捕获值的本质是在堆上开辟一块空间,将当前变量的值放到堆空间上。

2. LR简单语法介绍

数组

  • [数组的数量 x 数组存放的类型]
[<elementnumber> x <elementtype>]
 //example
alloca[24xi8],align8 24个i8类型,
  • in:多少位的整型,i8相当于8位,也就是1字节

结构体

  • %结构体名称 = type {<结构体成员类型,成员大小>}
%swift.refcounted = type {
    %swift.type*, i64 }

指针类型

你可能感兴趣的:(swift,闭包底层,闭包)