快速无主的安全
Posted
技术标签:
【中文标题】快速无主的安全【英文标题】:Safety of unowned in swift 【发布时间】:2016-04-28 13:02:37 【问题描述】:我从apple docs 阅读了有关unowned
的信息。
与弱引用一样,无主引用不会保持强保持 在它所指的实例上。然而,与弱引用不同的是, 假定无主引用始终具有值。因为这, 无主引用总是被定义为非可选类型。
所以看起来 unowned 类似于 weak 但它们是非可选的。
我想知道如果释放引用的 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
行进行某种安全检查
【问题讨论】:
Are Unowned references set to 'nil' when deinitialized?的可能重复 【参考方案1】:unowned
的检查版本已经存在 - 它被称为weak
。这是主要区别。 unowned
是不安全的,但在某些情况下它可以使您的代码更清晰。
【讨论】:
Unowned 是不安全的,因为它可能会使您的程序崩溃,但崩溃行为是明确定义的。例如,Unowned 不会导致您访问悬空引用。【参考方案2】:unowned
引用对于打破引用循环很有用,作为weak
的替代方法,当(正如您引用的 Apple Docs 所说)“您知道,一旦在初始化期间设置引用将永远不会为零。”
但是,您已经编造了一个示例,将 unowned
引用设置为对象,然后超出范围使 unowned
引用为零。
【讨论】:
以上是关于快速无主的安全的主要内容,如果未能解决你的问题,请参考以下文章