为什么我得到保留圈中的第二个例子吗?

问题描述 投票:3回答:1

为什么我们得到有力的参考圆在第二个例子,为什么我们在第一个例子没有?

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 
swift closures retain-cycle
1个回答
3
投票

在第一示例中,封闭件被执行一次时,它返回一个字符串,并且字符串被分配greeting。没有关闭;没有被捕获。这仅仅是一个匿名函数。如果你喜欢,你可以摆脱self.的,就像在一个名为功能。关键的一点是,greeting的类型是String

在第二个例子,是greeting闭合值,捕捉self。由于self持有greetinggreeting持有self,有一个循环。关键的一点是,greeting的类型是() -> String。这几乎可以肯定是错误的,因为这不是lazy是打算如何使用。

lazy是斯威夫特一个相当奇怪的特征,并且很可能是一个坏主意的的langauge包括我尽量避免它尽可能。有不正确地使用它几个微妙的方式,所以这并不奇怪,它咬你。)

© www.soinside.com 2019 - 2024. All rights reserved.