当使用闭包时,我们可以通过对捕获列表使用weak
或unowned
来避免强引用循环。
我知道函数也是一个命名闭包。所以我猜想函数也会从上下文中捕获值。
如何避免函数的强引用循环?
代码如下
class Person {
var name: String?
func printInfo() {
print(self.name ?? "nil")
}
deinit {
print("\(self.name ?? "") is deinitialized.")
}
}
var p1: Person? = Person()
p1?.name = "Person1"
var printFunction = p1?.printInfo
p1 = nil
不打印任何消息
...
p1 = nil
printFunction = nil
print Person1 已取消初始化。
有没有人能解决这个问题?在 closure 情况下,我们有 weak
、unowned
捕获列表。
最佳答案
您可以用闭包替换该方法。
class Person {
var name: String?
lazy var printInfo = { [unowned self] in
print(self.name ?? "nil")
}
deinit {
print("\(self.name ?? "") is deinitialized.")
}
}
var p1: Person? = Person()
p1?.name = "Person1"
var printFunction = p1?.printInfo
p1 = nil
此代码打印 - Person1 已取消初始化。
lazy 确保对属性的访问恰好发生在实例初始化之后,所以 self
肯定存在,我们可以在闭包中使用 self
body 。
如果您需要更多信息,请阅读有关 ARC 的信息 - https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html
关于swift - 快速捕获功能列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52700069/