在 Swift 中,无主与弱引用
In Swift, unowned vs. weak reference
如果你有一个 Dog 对 Bone 的弱引用,这意味着 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.
如果你有一个 Dog 对 Bone 的弱引用,这意味着 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 aBone
. And aBone
can exists without aDog
.
无主引用
再看一个例子
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 insideCreditCard
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.