为什么我可以在调用deinit方法后访问对象?

时间:2016-11-03 13:43:42

标签: swift swift3 automatic-ref-counting

我从Swift指南中的无主参考部分复制了大部分代码,然后在操场上运行...

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 john: Customer?

john = Customer(name: "John Appleseed")
john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)

var card = john!.card!

john = nil

card.customer.name
设置为john

nil会导致...

  

"约翰·阿普塞德德正在被“取消初始化\ n"

然后获得name属性给出了......

  

" John Appleseed"

因此,尽管已取消初始化,客户实例仍可访问!

这不应该导致nil引用异常吗?它在指南中说...

  

另请注意,如果您尝试,Swift会保证您的应用会崩溃   在引用的实例之后访问无主引用   释放。你永远不会遇到意想不到的行为   情况。您的应用程序将始终可靠地崩溃,尽管您应该,   当然,防止它这样做。

所以,我认为它一定不能被解除分配。然而,指南也说,

  

在类实例之前立即调用deinitializer   解除分配。

1 个答案:

答案 0 :(得分:0)

代码在常规项目中按预期工作,而不是游乐场。