闭包的定义
一个函数和它所捕获的变量常量环境组合起来,称为闭包 我们也可以将其分解成两部分: 1) 定义在函数内部的函数 2) 它捕获的是外层函数的局部变量
对于下面的代码:
typealias Fn = (Int) -> Int var num = 0 func getFn() -> Fn { // var num = 0 func plus(_ i: Int) -> Int { num += i return num } return plus } var fn = getFn() print(fn(1)) //1 print(fn(2)) //3 print(fn(3)) //6 print(fn(4)) //10
其实对于上面的代码无需太多的解释,num是一个全局变量,只分配一份,相当于执行1、2、3、4的累加,对于内存的打印如下所示:
如果把代码num变为getFn内部的成员变量,代码如下:
typealias Fn = (Int) -> Int //var num = 0 func getFn() -> Fn { var num = 0 func plus(_ i: Int) -> Int { num += i return num } return plus } var fn = getFn() print(fn(1)) //1 print(fn(2)) //3 print(fn(3)) //6 print(fn(4)) //10
内存的打印如下:
x/5xg 0x000000010061aa20 0x10061aa20: 0x0000000100004028 0x0000000200000002 0x10061aa30: 0x0000000000000001 0x00007fff2f3297f1 0x10061aa40: 0x000000004d55545a 3 (lldb) x/5xg 0x000000010061aa20 0x10061aa20: 0x0000000100004028 0x0000000200000002 0x10061aa30: 0x0000000000000003 0x00007fff2f3297f1 0x10061aa40: 0x000000004d55545a 6 (lldb) x/5xg 0x000000010061aa20 0x10061aa20: 0x0000000100004028 0x0000000200000002 0x10061aa30: 0x0000000000000006 0x00007fff2f3297f1 0x10061aa40: 0x000000004d55545a
可以从上面的汇编代码中看出,swift_allocObject相对应num在堆空间的地址,相当于num仅分配一份,所以等价于num全局变量