【发布时间】: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