闭包在使用外部变量时会对其创建一个强引用,因此如果这个变量指向一个对象,那么该对象也会被创建一个强引用。但如果在闭包内部使用let或者weak来修饰变量,那么就可以避免这个问题。如下示例:
class MyClass {
var name = "John"
deinit {
print("MyClass is deallocated")
}
}
var closure: (() -> Void)?
func createClosure() {
let object = MyClass()
object.name = "Alice"
// 在闭包内部使用weak修饰变量,避免创建强引用
closure = { [weak object] in
if let object = object {
print("Name is \(object.name)")
}
}
closure?()
}
createClosure() // 输出 "Name is Alice"
closure = nil // MyClass is deallocated