Swift 快速惰性var参考循环

Swift 快速惰性var参考循环,swift,Swift,我有一节课 class SomeClass { lazy var property1: Int = { return 1 }() lazy var property2: Int = { return self.property1 }() deinit { print("SomeClass will be destroyed") } } 如果我在操场上有以下物品: var a: SomeClass?

我有一节课

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将被销毁
消息将出现。 但是,如果我注释掉对属性的访问,如:

var a: SomeClass? = SomeClass()
//print(a?.property1)
//print(a?.property2)
a =  nil
我仍然收到消息
SomeClass将被销毁
。 我希望有一个引用周期,因为
property2
的闭包从未被调用,它通过
self.property1
引用
self


lazy
变量有什么特别的地方吗?或者仅仅是我的假设是错误的,
property2
持有对
self
的引用?

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


对于惰性属性,只有在您第一次访问
属性2
时才会调用
=
之后的所有内容。执行此操作时,将创建、调用闭包,并从内存中释放闭包,然后将值返回给您。这就是为什么你可以在结束语中摆脱自我。,因为它永远不会捕捉自我。

谢谢你的回答,这很有意义!但是,在第一部分中,您是否有关于闭包未存储在
a
上的参考?或者它存储在哪里?因为闭包被立即调用,所以它不会存储在任何地方。这和调用函数获取初始值没有什么不同。ie
lazy-var-property2:Int=someValue()