我有一个类
class SomeClass {
lazy var property1: Int = {
return 1
}()
lazy var property2: Int = {
return self.property1
}()
deinit {
print("SomeClass will be destroyed")
}
}
如果我在操场上有以下内容:
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
到self.property1
。
lazy
变量有什么特别之处,或者只是我的假设是错误的,property2
持有对self
的引用?
没有参考循环的原因是闭包没有存储在a
上。如果a
存储了闭包并且闭包包含 self,那么就会有一个参考循环。
对于惰性属性,=
之后的所有内容直到您第一次访问property2
时才被调用。当你这样做时,闭包被创建、调用、从内存中释放,然后值返回给你。这就是为什么你可以摆脱闭包中的self.
,因为它永远不会捕捉到自我。