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

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。由于selfholdsgreetinggreetingholdsself存在循环。关键是greeting的类型是() -> String。这几乎肯定是一个错误,因为这不是lazy的预期用途。
lazy在Swift中是一个相当奇怪的功能,在Langauge中包含它可能是一个坏主意。我尽量避免。有几种微妙的方法可以不正确地使用它,所以它咬了你一点也不奇怪。)

关于swift - 为什么我在第二个例子中得到保留圈?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54541698/

10-10 22:22