我从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 解除分配。
答案 0 :(得分:0)
代码在常规项目中按预期工作,而不是游乐场。