swift - 在 Swift 中相互引用的两个弱变量?

标签 swift automatic-ref-counting weak-references

我今天又做了一次尝试,试图理解 Swift 中的循环保留和弱引用。通读documentation ,我看到了以下代码示例,其中一个引用变量被标记为 weak 以防止保留循环:

class Person {
    let name: String
    init(name: String) { self.name = name }
    var apartment: Apartment? 
    deinit { print("\(name) is being deinitialized") }
}

class Apartment {
    let unit: String
    init(unit: String) { self.unit = unit }
    weak var tenant: Person?             // <---- This var is marked as 'weak'
    deinit { print("Apartment \(unit) is being deinitialized") }
}

var john: Person?
var unit4A: Apartment?

john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")

john!.apartment = unit4A
unit4A!.tenant = john

john = nil // prints "John Appleseed is being deinitialized"
unit4A = nil // prints "Apartment 4A is being deinitialized"

让两个变量都变弱有什么问题吗?也就是说,在 Person 类中,我可以将 apartment 变量更改为 weak 以便我有

class Person {
    // ...
    weak var apartment: Apartment?  // added 'weak'
    // ...
}

class Apartment {
    // ...
    weak var tenant: Person?
    // ...
}

其中有两个相互引用的弱变量。

我在 Playground 中对其进行了测试,它似乎工作正常,但是有什么充分的理由不这样做吗?在这种情况下,这里似乎没有天然的亲子关系。

最佳答案

你可以做到。唯一的副作用是您需要确保其他东西能够留住人和公寓。在原始代码中,您只需要保留人员,公寓(与人员相关联)将为您保留。

严格来说,当公寓被拆除时,人们并没有被杀死,而当人们死亡时,公寓也没有被拆除,所以在这种情况下,弱引用是有道理的。通常最好先考虑您想要的关系和所有权模型,然后再决定如何实现。

关于swift - 在 Swift 中相互引用的两个弱变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34565760/

相关文章:

ios - 使用__block变量阻止泄漏

swift - 在 Mac OS 应用程序中使用控件

ios - xcode 9.2 Storyboard中的不一致错误

ios - -fno-objc-arc 自动将编译器标志添加到许多使用保留和释放消息的文件

ios - 我可以使用 Objective-C block 作为属性吗?

python - 使用 python WeakSet 启用回调功能

swift - 中间件中的闭包为零

swift - 什么可以触发 Firebase Auth 系统中的登录 session 过期

objective-c - iOS ivar alloc/init 分配内存地址给另一个ivar

wpf - 为什么在控件上使用弱事件模式而不是在其他地方管理生命周期?