4

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

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

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

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

4

1 回答 1

21

强引用和弱引用

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

因此,当 A 对 B 有弱引用时,则 A不是所有者。

示例(其中 A 是Bone并且 B 是Dog

class Dog {
    var bone: Bone?
}

class Bone {
    weak var belongsTo: Dog?
}

强参考

这里 aDog 可以有一个Bone. 在这种情况下,它就是那个 Bone 的所有者。所以这个bone属性是一个强参考。

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

重要提示:在这种情况下,可以Dog存在而没有Bone. Bone罐头没有Dog. _ _

无主引用

让我们看另一个例子

class Person {
    var creditCard: CreditCard?
}

class CreditCard {
    unowned var owner: Person

    init(owner: Person) {
        self.owner = owner
    }
}

同样,Person 可以拥有一个 CreditCard,因此它具有一个对CreditCard.

然而,没有人就CreditCard 不能存在。对?所以在内部CreditCard我们想要一个总是被填充的属性,但我们也希望它是弱的。

像这样的东西

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

但是必须声明一个弱属性,Optional所以我们使用unownedwhich 表示:

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

于 2016-11-27T15:11:40.523 回答