Swift:无主引用

  • 本文关键字:引用 Swift ios swift
  • 更新时间 :
  • 英文 :


swift文档显示

无主引用是使用非可选类型定义的。

但我们可以将无主变量定义为可选变量。这似乎并不是一个硬性要求一个无主是非可选的。

弱可选&无主可选。。?

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") }
}

weakunowned都不会增加对象的引用计数;也就是说,如果没有剩余的强引用,它们不会阻止对象被释放。

weakunowned之间的主要区别在于当被引用的对象被释放时会发生什么;weak引用变为nil,而unowned引用仍然保留对对象的引用(现在无效(,因此如果您尝试访问它,您的程序将崩溃。

需要对弱引用使用可选项,因为它可以变成nil。对无主引用使用可选引用在语法上是可能的,但语义是不合理的。来自Swift编程语言书籍:

。。。当另一个实例具有相同的生存期或更长的生存期时,将使用无主引用

给定此定义,unowned属性不应为nil。你可以从你的例子中看到这一点;显然,公寓可能没有租户,而目前是租户的人可能会不复存在;如果将unowned与可选的tenant一起使用,则会留下一个无效的租户引用。

考虑一下这与书中给出的信用卡示例之间的区别:

CustomerCreditCard之间的关系与上述弱参考示例中的Apartment和Person之间的关系略有不同。在这个数据模型中,客户可能有也可能没有信用卡,但信用卡将始终与客户相关联。CreditCard实例的寿命永远不会超过它所引用的Customer。为了表示这一点,Customer类具有可选的card属性,但CreditCard类具有无主(和非可选(customer属性。

最新更新