swift - 为什么我在第二个例子中得到保留圈?

标签 swift closures retain-cycle

为什么我们在第二个例子中得到了强引用圈,为什么我们在第一个例子中没有?

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 包含 greetinggreeting 包含 self,因此存在一个循环。关键是greeting的类型是() -> String。这几乎肯定是一个错误,因为这不是 lazy 的用途。

(lazy 是 Swift 中一个非常奇怪的特性,将其包含在语言中可能不是一个好主意。我尽量避免使用它。有几种微妙的使用方法不正确,所以它咬了你也就不足为奇了。)

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

相关文章:

ios - 具有透明背景的 Swift 模态视图 Controller

swift - 为什么如果我为导航 Controller 栏设置颜色,它看起来与 Photoshop 或任何应用程序不同?

IOS block 不保留 self ?

ios - 如果从 Block 调用的方法使用 self,我是否需要使用弱 self 指针?

swift - 解析 containsIn 查询不返回结果

objective-c - 没有协议(protocol)的 iOS 委托(delegate)?

javascript - 在 Javascript 中,为什么从构造函数返回一个函数会破坏对象?

javascript - `this.some_property` 在匿名回调函数中变为未定义

python - 关闭是如何实现的?

ios - 为什么使用 ivar 会导致 react 性 cocoa 中的保留循环?