2016-04-28 63 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