簡體   English   中英

無主參考有什么用?

[英]What good are unowned references?

弱和無主引用用於防止在兩個對象各自保持對另一個的引用的情況下的保留周期。 我得到弱者的使用,但我沒有得到無主的使用。 以下是Apple的示例,其中兩個對象之一應使用無主參考:

class Customer {
    let name: String
    var card: CreditCard?
    init(name: String) { self.name = name }
}

class CreditCard {
     let number: UInt64
     unowned let customer: Customer
     init(number: UInt64, customer: Customer) {
         self.number = number
         self.customer = customer
     }
}

這個想法是沒有客戶就不能存在信用卡。 因此,信用卡可以省去使用弱引用所需的可選展開,並且可以使用無主參考。 嗯...那么為什么不使用強大的參考? 如果對客戶的所有其他引用都消失了(這不應該發生?)那么信用卡使用自己的引用會導致崩潰; 而使用強引用會導致內存泄漏。 咦? 兩種邪惡之間的選擇? 更好地崩潰,因為在開發和測試期間更容易被注意到?

請幫忙解決一下。 謝謝。

更好地崩潰,因為在開發和測試期間更容易被注意到?

是。

好吧,不完全是。

我們的想法是,您的應用程序的設計應該確保沒有任何CreditCard實例超過它的相應Customer實例。 當你使用unowned你相信自己有一個在游戲中的設計,從邏輯上保證了無崩潰的執行。

現在,為什么有人會因為weak使用unowned 簡單! unowned消除了Optional解包的全部麻煩,如果你知道你的CreditCard實例永遠不會比它的各個Customer實例更長,那么你應該通過各種方式使用unowned

在沒有合適的情況下(即確定無主對象不會不存在), unowned實際上比weak要好得多,因為:

  • 弱引用必須是可選的,可能需要展開,並且

  • 弱引用需要大量開銷以跟蹤引用,並且如果它被釋放則將其更改為nil ,而無主引用需要零開銷。

它實際上不是問題,因為無論如何, unowned參考不會產生任何強大的參考周期。 取消分配Customer對象后,其CreditCard也將立即解除分配。 您的CreditCard永遠不會有機會引用該已解除分配的Customer

非常有趣的問題。 根據Apple的文檔,這里有一些Weak和Unowned References之間的區別

弱參考

弱引用是一種引用,它不會強制保留它引用的實例,因此不會阻止ARC處理引用的實例。 此行為會阻止引用成為強引用循環的一部分。

無主參考文獻

就像一個弱引用一樣,無主引用並不能保持它所引用的實例的強大保持。 但是,與弱引用不同,當另一個實例具有相同的生命周期或更長的生命周期時,將使用無主引用。

你的問題的答案:

weak可以變為零,而unowned認為永遠不會變為零,因此weak將是可選的,因為unowned不需要是可選的。

在這種情況下, Customer可能會或可能不會有CreditCard ,但沒有CreditCard應該不存在Customer

好的,我終於明白了:

  1. 對客戶的最后一次引用(信用卡除外)設置為零。
  2. ARC檢查客戶的引用計數:
  3. 信用卡有很強的參考價值 - 客戶的參考計數為1,因此ARC不會解除分配。 結果 - 內存泄漏。
  4. 或者,信用卡有一個無主參考 - 客戶的參考計數為0,因此ARC將解除分配。 這樣做會導致信用卡的引用計數變為0,從而導致其被解除分配。 因此,信用卡永遠不會有機會取消其現在的無主要參考。 結果 - 沒有崩潰。

因此,如果我們設計了我們的代碼,以便在引用的對象(Customer)被釋放時保證引用的持有者(CreditCard)被解除分配,那么我們就有了這樣的場景,因此設計了無主引用。

謝謝@Bob

快速搜索此主題會發現鏈接指向另一個SO答案。

基本上weak引用可以是也可以不是nil ,因為unowned引用假設它永遠不會是nil

您可以在Apple文檔中了解有關它們的更多信息。

我猜測背后的原因使用unowned在這種情況下,僅僅是因為unowned被假定為永遠nil (無客戶)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM