要确定闭包内部的闭包是否逃逸,可以检查闭包内部对外部变量的引用是否会在闭包外部被持有。如果闭包内部对外部变量的引用在闭包外部被持有,那么该闭包就是逃逸的。否则,闭包就是非逃逸的。
下面是一些示例代码,演示了闭包的逃逸和非逃逸情况:
示例1:闭包非逃逸
func createClosure() -> () -> Void {
var count = 0
let closure = {
count += 1
print(count)
}
return closure
}
let closure = createClosure()
closure() // 输出: 1
closure() // 输出: 2
在这个示例中,闭包内部对外部变量count
进行了引用,但闭包被直接返回并调用了,没有在闭包外部被持有。因此,该闭包是非逃逸的。
示例2:闭包逃逸
var closures: [() -> Void] = []
func appendClosure(closure: @escaping () -> Void) {
closures.append(closure)
}
func executeClosures() {
for closure in closures {
closure()
}
}
appendClosure {
print("Closure 1")
}
appendClosure {
print("Closure 2")
}
executeClosures() // 输出: "Closure 1" 和 "Closure 2"
在这个示例中,闭包closure
被添加到了全局变量closures
中,并在executeClosures()
函数中被循环调用。这意味着闭包在创建后被持有了,并且在闭包内部对外部变量的引用逃逸到了闭包的外部。因此,该闭包是逃逸的。
通过检查闭包对外部变量的引用是否逃逸,可以确定闭包内部的闭包是否逃逸或非逃逸。
上一篇:闭包没有返回期望的输出