在 Swift 中,无主与弱引用

In Swift, unowned vs. weak reference

如果你有一个 DogBone 的弱引用,这意味着 Dog 是 'owner'这种情况下的引用,它使用骨骼,但是骨骼可以不存在而 Dog 仍然可以运行(因为对骨骼的引用是可选的)。

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

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

为什么不直接使用 weak 呢?据我了解,这只与大声失败与默默失败有关。在无主的情况下,如果骨头最终没有狗,应用程序总是会崩溃,而如果我们使用 weak,你最终会得到一个仍然存在的骨头,有 'ghost' 只狗。

强引用和弱引用

A weak reference is a reference that does not keep a strong hold on the instance it refers to, and so does not stop ARC from disposing of the referenced instance.

所以当 A 对 B 有弱引用时,A 是 NOT 所有者。

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

class Dog {
    var bone: Bone?
}

class Bone {
    weak var belongsTo: Dog?
}

强引用

这里有一个Dog可以有一个Bone。在这种情况下,它是该 Bone 的所有者。所以 bone 属性 是一个很强的参考。

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

Important: In this scenario a Dog can exists without a Bone. And a Bone can exists without a Dog.

无主引用

再看一个例子

class Person {
    var creditCard: CreditCard?
}

class CreditCard {
    unowned var owner: Person

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

同样,Person 可以拥有一张 CreditCard,因此它有一个所有者 属性,这是对 CreditCard.

的强引用

However a CreditCard CANNOT exist without a person. Right? So inside CreditCard we want a property which will always be populated but we also want it to be weak.

像这样

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

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

I want a weak reference and it will always be populated.