swfit 闭包中的强引用问题 实例说明
时间: 2024-03-12 10:49:03 浏览: 49
下面是一个使用闭包的例子:
```swift
class Person {
var name: String
var sayHelloClosure: (() -> Void)?
init(name: String) {
self.name = name
}
deinit {
print("\(name) is being deinitialized")
}
}
var person: Person? = Person(name: "Tom")
person?.sayHelloClosure = {
print("Hello, \(person!.name)!")
}
person?.sayHelloClosure?()
person = nil
```
在上面的例子中,我们创建了一个 `Person` 类,其中有一个叫做 `sayHelloClosure` 的可选闭包属性。然后我们将一个闭包赋值给这个属性,这个闭包中使用了 `person` 对象的 `name` 属性。最后我们执行这个闭包,并将 `person` 对象置为 `nil`。
如果我们不处理闭包中的强引用问题,就会导致 `Person` 对象无法被释放,从而产生内存泄漏。为了避免这个问题,我们可以修改闭包的定义,使用 `[weak self]` 来捕获 `self`:
```swift
person?.sayHelloClosure = { [weak self] in
guard let self = self else { return }
print("Hello, \(self.name)!")
}
```
这样就避免了闭包中对 `Person` 对象的强引用,从而使 `Person` 对象能够被正确地释放。
阅读全文