Swift 惰性变量引用循环

标签 swift

我有课

class SomeClass {
    lazy var property1: Int = {
        return 1
    }()

    lazy var property2: Int = {
       return self.property1
    }()

    deinit {
        print("SomeClass will be destroyed")
    }
}

如果我在 Playground 上有以下内容:

var a: SomeClass? = SomeClass()
print(a?.property1)
print(a?.property2)
a =  nil

然后变量 a 将被取消初始化,因为 SomeClass will be destroyed 消息将出现。 但是,如果我注释掉对属性的访问,例如:

var a: SomeClass? = SomeClass()
//print(a?.property1)
//print(a?.property2)
a =  nil

我仍然收到消息 SomeClass will be destroyed。 我希望有一个引用循环,因为永远不会调用 property2 的闭包,它通过 self.property1 引用 self

lazy 变量有什么特别之处,还是我的假设是错误的,property2 持有对 self 的引用?

最佳答案

没有引用循环的原因是闭包没有存储在a上。如果 a 存储闭包并且闭包包含 self 那么就会有一个引用循环。

对于惰性属性,= 之后的所有内容直到您第一次访问 property2 时才会被调用。当你这样做时,闭包被创建、调用、从内存中释放,然后值被返回给你。这就是为什么你可以去掉闭包中的 self. 因为它永远不会捕获 self.

关于Swift 惰性变量引用循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57713603/

相关文章:

swift - 如何从 .mm 调用 swift?

iOS + Swift,如何访问所有音乐文件

swift - 具有通用功能的相关类型协议(protocol)的协议(protocol)

linux - 在 ubuntu/linux 上使用 NSJSONSerialization 和 swift

ios - 未找到架构 x86_64 的符号 - iOS

xcode - 我应该使用什么函数来调出 CVCalendar 中的完整菜单?

ios - Swift 使用 CollectionType .filter .indexOf 和 .map 在元组数组中查找值

ios - 无法对齐数组中的图像(图集)-SpriteKit

ios - 接收 swift ; ViewController 从未取消初始化

ios - NSSession 的 dataTaskWithResult 返回 nil