迅速拥有的安全性

时间:2016-04-28 13:02:38

标签: swift

我正在阅读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行进行某种安全检查

2 个答案:

答案 0 :(得分:2)

unowned的已检查版本已经存在 - 它被称为weak。这是主要的区别。 unowned不安全,但在某些情况下,它可以使您的代码更清晰。

答案 1 :(得分:0)

unowned引用对于打破引用周期作为weak的替代方法非常有用(如您所引用的Apple文档所述)"您知道一旦引用它就永远不会为nil在初始化期间设置。"

但是,您已经捏造了一个设置unowned对象的引用的示例,该对象超出范围,使unowned引用为零。