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
上的参考?或者它存储在哪里?因为闭包被立即调用,所以它不会存储在任何地方。这和调用函数获取初始值没有什么不同。ielazy-var-property2:Int=someValue()