【问题标题】:In Swift, unowned vs. weak reference [duplicate]在 Swift 中,无主与弱引用 [重复]
【发布时间】:2017-04-11 08:17:12
【问题描述】:

如果你有一个对 Bone 的弱引用的 Dog,这意味着在这种情况下,Dog 是引用的“所有者”,并且它使用骨骼,但是bone 可以不存在并且Dog 仍然可以工作(因为对bone 的引用是可选的)。

但是对于'unowned',似乎关键字'unowned'不是在引用的所有者声明中使用,而是在另一个对象中使用。例如,Bone 对其狗的引用被标记为“unowned”。

无主不安全。如果所有者在程序中的某个时刻不存在,它可能会崩溃,并且它不能是可选的。为什么要使用 unowned 而不是弱引用?

为什么不只使用弱呢?据我了解,这与大声失败与默默失败有关。在 unowned 的情况下,如果 bone 最终没有狗,应用程序总是会崩溃,而如果我们使用 weak,您最终会得到仍然存在的骨头,带有“幽灵”狗。

【问题讨论】:

    标签: ios swift reference weak-references unowned-references


    【解决方案1】:

    强引用和弱引用

    弱引用是一种不会对其引用的实例保持强控制的引用,因此不会阻止 ARC 处理被引用的实例。

    所以当 A 对 B 有弱引用时,那么 A 不是所有者。

    示例(其中 A 是 Bone,B 是 Dog

    class Dog {
        var bone: Bone?
    }
    
    class Bone {
        weak var belongsTo: Dog?
    }
    

    强参考

    这里有一个Dog 可以有一个Bone。在这种情况下,它就是那个 Bone 的所有者。所以bone 属性是一个强引用。

    弱参考 Bone 可以属于 Dog。但是我们需要将belongsTo 属性声明为弱,否则我们会有一个强保留周期(这意味着一旦我们完成了这些对象,ARC 就不会释放它们)。

    重要提示:在这种情况下,Dog 可以存在没有BoneBone 可以存在没有 Dog

    无主引用

    让我们看另一个例子

    class Person {
        var creditCard: CreditCard?
    }
    
    class CreditCard {
        unowned var owner: Person
    
        init(owner: Person) {
            self.owner = owner
        }
    }
    

    同样,Person 可以拥有一张 CreditCard,因此它有一个 owner 属性,它是对 CreditCard 的强引用。

    但是CreditCard 不能在没有人的情况下存在。正确的? 所以在CreditCard 内部,我们想要一个始终被填充的属性,但我们也希望它是弱的。

    类似的东西

    weak var owner: Person 
    error: 'weak' variable should have optional type 'Person?'
    

    但是弱属性必须声明为Optional,所以我们使用unowned,这意味着:

    我想要一个弱引用,它总是会被填充。

    【讨论】:

    • 那么让我直说吧。使用weak,即使它拥有弱引用的引用被删除,所有者仍然可以持久化。但是,对于无主,则相反...“所有者”又名该人,可以在没有信用卡的情况下存在,但是如果在信用卡之前删除该人,则会发生错误并使程序崩溃。是吗?
    • @user7024499:完全正确
    • 最后要明白,在您的信用卡示例中,当人员实例仍在内存中使用它时,无法从内存中删除信用卡实例......通常。不过因为unowned这个关键词,就是说如果这张信用卡内存溢出没关系,只要在人之前内存溢出就好了。
    • @user7024499 CreditCard 不会被释放,因为 Person 对它有很强的引用。
    • @user7024499 但是,如果您将 person.creditCard 设置为 nil,则 CreditCard 将被解除分配。所以你可以有一个没有 CrediCard 的 Person。另一方面,CreditCard 必须始终与 Person 关联,因为没有 Person 就不能拥有 CreditCard
    猜你喜欢
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    相关资源
    最近更新 更多