快速惰性变量参考周期



我有一个类

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的闭包,并且它引用selfself.property1

lazy变量有什么特别之处,或者只是我的假设是错误的,property2持有对self的引用?

没有参考循环的原因是闭包没有存储在a上。如果a存储了闭包并且闭包包含 self,那么就会有一个参考循环。

对于惰性属性,=之后的所有内容直到您第一次访问property2时才被调用。当你这样做时,闭包被创建、调用、从内存中释放,然后值返回给你。这就是为什么你可以摆脱闭包中的self.,因为它永远不会捕捉到自我。

最新更新