使用闭包时,我们可以通过使用weak
或unowned
作为捕获列表来避免 strong参考周期。
我知道该函数也是一个命名的闭包。所以我想函数也可以从上下文中捕获值。
如何避免使用 strong参考周期?
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
打印Person1 is deinitialized.
有人对此案有解决方案吗?在关闭的情况下,我们有weak
,unowned
个捕获列表。
答案 0 :(得分:1)
您可以使用闭包代替该方法。
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 is deinitialized.
lazy确保对属性的访问恰好在实例初始化之后进行,因此self
肯定存在,我们可以在闭包主体中使用self
。
如果您需要更多有关ARC的信息,请阅读-https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html