如果您的 Dog 具有对 Bone 的弱引用,则表示该狗是其所有者'在这种情况下的参考,它使用骨骼,但骨骼可以不存在,狗仍然可以运作(因为对骨骼的引用是可选的)。
然而,对于'无主',似乎关键字“无主”'不是在所有者的引用声明中使用,而是在另一个对象中使用。例如,Bone对其狗的引用被标记为“无主”'。
无主是不安全的。如果所有者在程序中的某个时刻不存在,它可能会崩溃,并且它不能是可选的。为什么一个人会使用无主而不是弱的参考?
为什么不使用弱?从我的理解来看,这只是与大声失败和失败的失败有关。在无主的情况下,如果骨头没有狗,应用程序将始终崩溃,而如果我们使用弱,您将最终得到一个仍然存在的骨骼,并带有一个“鬼”。狗。
答案 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
可以存在,不含 aBone
。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
,因此我们使用unowned
,这意味着:
我想要一个弱引用,它将始终填充。