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值还是会累计。