Swift 闭包引用类型

func makeIncrementer(forIncrement amount: Int) -> () -> Int {
    var runningTotal = 0
    func incrementer() -> Int {
        runningTotal += amount
        return runningTotal
    }
    return incrementer
}

上面的函数返回一个闭包,我们使用一个常量去接受这个返回值

let incrementByTen = makeIncrementer(forIncrement: 10)

这里的 incrementByTen 常量就是 incrementer 这个函数引用

incrementByTen()
//10
incrementByTen()
// 20
incrementByTen()
// 30

这里我们可以看到 runningTotal 这个值,在我们使用返回闭包调用的时候是有累积的。这就说明runningTotal被一个引用类型的值持有着没有被释放。这个引用类型应该就是 incrementByTen

let incrementBySeven = makeIncrementer(forIncrement: 7)
incrementBySeven()
// 7
incrementByTen()
//40

这里我们可以明显的看到,新的常量incrementBySeven和之前的常量incrementByTen有着不同的runningTotal,因为他们是两个独立的引用类型。

这里说的引用类型可以类比于类和数组以及字典这类型的数据。他们的生命周期都是依靠引用计数来维持。

let alsoIncrementByTen = incrementByTen
alsoIncrementByTen()
// 50

incrementByTen()
// 60

这里只是incrementByTen的引用计数变成了2,并没有开辟新的内存空间,所以runningTotal值还是会累计。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容