我正在阅读apple docs中的unowned
。
与弱引用一样,无主引用并不能保持强势 在它所指的实例上。然而,与弱参考不同,a 假定无主参考始终具有值。因为这, 无主引用始终定义为非可选类型。
因此,看起来无主的类似弱者,但他们是非选择性的。
我想知道如果引用的unowned被解除分配会发生什么。为什么没有像期权这样的支票。
我的意思是我可以做这样的事情,
class Customer {
let name: String
var card: CreditCard?
init(name: String) {
self.name = name
}
deinit { print("\(name) is being deinitialized") }
}
class CreditCard {
let number: UInt64
unowned let customer: Customer
init(number: UInt64, customer: Customer) {
self.number = number
self.customer = customer
}
deinit { print("Card #\(number) is being deinitialized") }
}
var card: CreditCard? = nil
do {
var john: Customer
john = Customer(name: "John Appleseed")
john.card = CreditCard(number: 1234_5678_9012_3456, customer: john)
card = john.card
}
print("Card belongs to \(card?.customer.name)")
在最后一行假设unowned
总是有一个值,试着打印持卡人的名字,我得到一个“执行被中断,原因:EXE_BREAKPOINT ......”
我认为应该没有这样的问题,或者应该在第card = john.card
行进行某种安全检查
答案 0 :(得分:2)
unowned
的已检查版本已经存在 - 它被称为weak
。这是主要的区别。 unowned
不安全,但在某些情况下,它可以使您的代码更清晰。
答案 1 :(得分:0)
unowned
引用对于打破引用周期作为weak
的替代方法非常有用(如您所引用的Apple文档所述)"您知道一旦引用它就永远不会为nil在初始化期间设置。"
但是,您已经捏造了一个设置unowned
对象的引用的示例,该对象超出范围,使unowned
引用为零。