如果您有狗在这种情况下,它使用骨骼,但是骨骼可以消失,狗仍然可以起作用(因为对骨骼的引用是可选的)。
然而,使用"无人",似乎不是在所有者声明参考文献中而是在另一个对象中使用的关键字"未拥有"。例如,骨头对狗的提及被标记为"无人"。
不安全。如果所有者在程序中的某个时候不存在,并且不能是可选的,则可能会崩溃。为什么一个人会使用无人使用而不是弱参考?
为什么不使用弱?从我的理解来看,这与大声失败与默默失败有关。如果是一个无人驾驶的情况,如果骨头最终没有狗,该应用将始终崩溃,而如果我们使用弱者,您最终会出现仍然存在的骨头,并带有"幽灵"狗。
strong&弱参考
一个弱参考是一种参考,该参考不会在其指称的实例上保持强烈持有,因此不会阻止ARC处置参考实例。
因此,当A对B的参考较弱时,A IS 不是所有者。
示例(其中a为 Bone
和b是 Dog
)
class Dog {
var bone: Bone?
}
class Bone {
weak var belongsTo: Dog?
}
强参考
这里 Dog
can 有一个Bone
。在这种情况下,这是那骨的所有者。因此,bone
属性是一个很强的参考。
弱参考Bone
可以属于狗。但是我们需要将belongsTo
属性声明为弱,否则我们有一个强大的保留周期(这意味着一旦我们完成了这些对象,ARC就不会释放这些对象)。
重要:在这种情况下,
Dog
可以存在,而无需 aBone
。Bone
可以存在没有 aDog
。
未经所有的参考
让我们看另一个示例
class Person {
var creditCard: CreditCard?
}
class CreditCard {
unowned var owner: Person
init(owner: Person) {
self.owner = owner
}
}
再次可以拥有信用卡,因此它具有所有者财产,是对CreditCard
的强烈参考。
但是,没有人就无法存在
CreditCard
无法存在。正确的? 因此,在CreditCard
中,我们想要一个属性,该属性将始终被人口填充,但我们也希望它很弱。
类似这样的东西
weak var owner: Person
error: 'weak' variable should have optional type 'Person?'
但是,必须将弱属性声明为Optional
,因此我们使用unowned
,这意味着:
我想要一个薄弱的参考,它将始终被填充。