美文网首页iOS逆向
Swift 闭包底层探究

Swift 闭包底层探究

作者: 一粒咸瓜子 | 来源:发表于2022-07-04 13:51 被阅读0次

闭包

闭包:一个函数和它所捕获的变量\常量环境组合起来,称为闭包
(一般它捕获的是外层函数的局部变量\常量)

  • 可以把闭包想象成是一个类的实例对象
    • 捕获的局部变量\常量就是对象的成员(存储属性)
    • 组成闭包的函数就是类内部定义的方法
func getFn() -> (Int) -> Int {
    var num = 0
    return { 
        num += $0;
        return num;
    }
}

var fn = getFn() // malloc堆地址 将外部变量num存入
print(fn(1)) // 1
print(fn(2)) // 3
print(fn(3)) // 6
print(fn(4)) // 10

print(getFn()(1)) // 1  malloc
print(getFn()(2)) // 2  malloc
print(getFn()(3)) // 3  malloc
print(getFn()(4)) // 4  malloc

反汇编查看

  • 将局部变量注掉,观察运行过程中并没有调用 swiftallocObject,并没有向堆空间申请地址。


  • 使用局部变量时,闭包内部需要捕获外部的局部变量/常量,存储在堆空间中。 打印 rax,获取闭包在堆空间保存变量的地址的位置。


  • 将断点打在 num 变化处,去堆空间地址中查看存储数值是否发生改变,若能对应得上,则证明猜想正确。


练习

typealias Fn = (Int) -> (Int, Int)

func getFns() -> (Fn, Fn) {
    // 分别创建两个地址保存,但数据是共用的
    var num1 = 0 // malloc num1
    var num2 = 0 // malloc num2
    func plus(_ i: Int) -> (Int, Int) {
        num1 += i
        num2 += i << 1    // *2
        return (num1, num2)
    }
    func minus(_ i: Int) -> (Int, Int) {
        num1 -= i
        num1 -= i << 1
        return (num1, num2)
    }
    return (plus, minus)
}
// 把闭包想象成是一个类的实例对象,捕获的局部变量\常量就是对象的成员
let (p, m) = getFns()
print(p(5)) // (5, 10)
print(m(4)) // (1, 2)
print(p(3)) // (4, 8)
print(m(2)) // (2, 4)

相关文章

  • Swift 闭包底层探究

    闭包 闭包:一个函数和它所捕获的变量\常量环境组合起来,称为闭包(一般它捕获的是外层函数的局部变量\常量) 可以把...

  • Swift-闭包

    Swift 闭包 函数 ()->() Swift 中的闭包和 Objective-C 中的 block 类似,闭包...

  • Swift闭包和函数

    函数在Swift中只是一种特殊的闭包,闭包在Swift语言中是一等公民,支持闭包嵌套和闭包传递。Swift中的闭包...

  • Swift底层探索:闭包

    闭包是可以在你的代码中被传递和引用的功能性独立代码块。闭包在实现上是一个结构体,它存储了一个函数(通常是其入口地址...

  • swift4 闭包

    swift 闭包 闭包:swift 中 函数是闭包的一种类似于oc的闭包闭包表达式(匿名函数) -- 能够捕获上下...

  • Swift中的闭包

    在Swift中有两种闭包,逃逸闭包(@escaping)和非逃逸闭包(@nonescaping)。从Swift 3...

  • 100 Days of Swift - Day 06 - 闭包(

    100 Days of Swift - Day 06 - 闭包Closures 6.1 闭包 Swift函数也属于...

  • swift学习

    * 闭包 * 闭包作为属性 ```swift // 声明闭包类型 typealias callba...

  • iOS swift 逃逸闭包(@escaping)和非逃逸闭

    iOS swift 逃逸闭包(@escaping)和非逃逸闭包 (@noescaping) 逃逸闭包: 逃逸闭包...

  • iOS&Swift&OC 闭包和Block的相互转化

    一、Swift的闭包 -> OC的block 二、OC的block -> Swift的闭包

网友评论

    本文标题:Swift 闭包底层探究

    本文链接:https://www.haomeiwen.com/subject/keudbrtx.html