我有课
class SomeClass {
lazy var property1: Int = {
return 1
}()
lazy var property2: Int = {
return self.property1
}()
deinit {
print("SomeClass will be destroyed")
}
}
如果我在 Playground 上有以下内容:
var a: SomeClass? = SomeClass()
print(a?.property1)
print(a?.property2)
a = nil
然后变量 a
将被取消初始化,因为 SomeClass will be destroyed
消息将出现。
但是,如果我注释掉对属性的访问,例如:
var a: SomeClass? = SomeClass()
//print(a?.property1)
//print(a?.property2)
a = nil
我仍然收到消息 SomeClass will be destroyed
。
我希望有一个引用循环,因为永远不会调用 property2
的闭包,它通过 self.property1
引用 self
。
lazy
变量有什么特别之处,还是我的假设是错误的,property2
持有对 self
的引用?
最佳答案
没有引用循环的原因是闭包没有存储在a
上。如果 a
存储闭包并且闭包包含 self 那么就会有一个引用循环。
对于惰性属性,=
之后的所有内容直到您第一次访问 property2
时才会被调用。当你这样做时,闭包被创建、调用、从内存中释放,然后值被返回给你。这就是为什么你可以去掉闭包中的 self.
因为它永远不会捕获 self.
关于Swift 惰性变量引用循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57713603/