为什么我们得到有力的参考圆在第二个例子,为什么我们在第一个例子没有?
class Test1 {
var name: String = "Ted"
lazy var greeting = { return "Hello \(self.name)" }()
deinit{print("goodby1")} // No retain cycle here ..
}
var v1:Test1? = Test1()
v1?.greeting
v1 = nil //prints goodby1, dealocation done
class Test {
var name: String = "Mery"
lazy var greeting = {return "Hello \(self.name)"}
deinit{print("goodby")} //retain cycle here
}
var v: Test? = Test()
v!.greeting
v = nil
在第一示例中,封闭件被执行一次时,它返回一个字符串,并且字符串被分配greeting
。没有关闭;没有被捕获。这仅仅是一个匿名函数。如果你喜欢,你可以摆脱self.
的,就像在一个名为功能。关键的一点是,greeting
的类型是String
。
在第二个例子,是greeting
闭合值,捕捉self
。由于self
持有greeting
和greeting
持有self
,有一个循环。关键的一点是,greeting
的类型是() -> String
。这几乎可以肯定是错误的,因为这不是lazy
是打算如何使用。
(lazy
是斯威夫特一个相当奇怪的特征,并且很可能是一个坏主意的的langauge包括我尽量避免它尽可能。有不正确地使用它几个微妙的方式,所以这并不奇怪,它咬你。)