【问题标题】:Why can I access an object after its deinit method has been called?为什么我可以在调用 deinit 方法后访问对象?
【发布时间】:2017-03-17 03:08:05
【问题描述】:

我从 Swift 指南的 Unowned References 部分复制了大部分代码,并在操场上运行了它...

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 会导致...

“John Appleseed 正在被“取消初始化\n”

但随后获得 name 属性会给出...

“约翰苹果籽”

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

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

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

所以,我认为它一定没有被释放。然而,指南还说,

在类实例被调用之前立即调用反初始化器 已解除分配。

【问题讨论】:

  • 不要使用游乐场(它们是超级错误且不可靠的) - 使用适当的 Swift 环境,例如完整的项目。在完整的项目中,此代码按预期崩溃。

标签: swift swift3 automatic-ref-counting


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 2014-09-21
    相关资源
    最近更新 更多