在斯威夫特,无主与弱参考

时间:2016-11-27 14:51:07

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

如果您的 Dog 具有对 Bone 的弱引用,则表示该狗是其所有者'在这种情况下的参考,它使用骨骼,但骨骼可以不存在,狗仍然可以运作(因为对骨骼的引用是可选的)。

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

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

为什么不使用弱?从我的理解来看,这只是与大声失败和失败的失败有关。在无主的情况下,如果骨头没有狗,应用程序将始终崩溃,而如果我们使用弱,您将最终得到一个仍然存在的骨骼,并带有一个“鬼”。狗。

1 个答案:

答案 0 :(得分:20)

强大&弱引用

  

弱引用是一个引用,它不会强制保留它引用的实例,因此不会阻止ARC处理引用的实例。

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

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

class Dog {
    var bone: Bone?
}

class Bone {
    weak var belongsTo: Dog?
}

强参考

此处Dog 可以拥有Bone。在那种情况下,它是该骨头的所有者。所以bone属性是一个强大的参考。

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

  

重要提示:在这种情况下,Dog可以存在,不含 a BoneBone可以存在,不含一个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,因此我们使用unowned,这意味着:

  

我想要一个弱引用,它将始终填充。