快速文档说
未使用的引用是使用非可选类型定义的。
但是我们可以将一个无主变量定义为可选变量。似乎没有一个强制性要求非强制性非强制性要求。
弱可选与无主可选之间有什么区别?
class Person {
let name: String
var apartment: Apartment?
init(name: String) {
self.name = name
print("\(name) is being initialized")
}
deinit {
print("\(name) is being deinitialized")
}
}
class Apartment {
let unit: String
init(unit: String) { self.unit = unit }
unowned var tenant: Person?
deinit { print("Apartment \(unit) is being deinitialized") }
}
weak
和unowned
都不增加对象的引用计数;也就是说,如果没有剩余的强引用,它们将不会阻止对象的释放。
weak
和unowned
之间的主要区别是释放引用对象时发生的情况; weak
引用变为nil
,而unowned
引用仍保留对该对象的引用(现在无效),因此,如果尝试访问它,程序将崩溃。
由于弱参考可能变成nil
,因此需要为弱参考使用可选的。在语法上可以使用可选参数作为无主引用,但是语义并不明智。从Swift编程语言书中:
...当另一个实例具有相同的生存期或更长的生存期时,使用无主引用
鉴于此定义,unowned
属性应为nil
。您可以从示例中看到这一点;显然,公寓可能没有房客,而目前是房客的人可能不复存在;如果将unowned
与可选的tenant
一起使用,将留下无效的租户参考。
考虑这与书中给出的信用卡示例之间的区别:
Customer
和CreditCard
之间的关系与上述弱参考示例中的Apartment和Person之间的关系略有不同。在此数据模型中,客户可能拥有或可能没有信用卡,但是信用卡将始终与该客户相关联。CreditCard
实例永远不会超过其引用的Customer
。为了表示这一点,Customer
类具有可选的card属性,但是CreditCard
类具有未拥有(且非可选)的客户属性。