2016-04-28 84 views
1

我从apple docs阅读约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

+0

可能的重复[是否将无主的引用设置为'无'时被初始化?](http://stackoverflow.com/questions/33491392/are-unowned-references-set-to-nil-when-deinitialized) – zneak

回答

0

unowned引用是有用的突破(如你引用的苹果文档所说),“你知道在初始化过程中引用永远不会为零”,这是一个替代weak的参考周期。

但是,您已经编写了一个示例,将一个对象的参考设置为unowned,然后超出范围使unowned引用为零。

2

unowned的检查版本已经存在 - 它被称为weak。这是主要的区别。 unowned是不安全的,但它可以让你的代码更清晰一些。

+0

无主是不安全的,因为它可能会导致程序崩溃,但崩溃行为是明确的。例如,无主的不会导致您访问悬挂的参考。 – zneak