[英]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
。
好的,我終於明白了:
因此,如果我們設計了我們的代碼,以便在引用的對象(Customer)被釋放時保證引用的持有者(CreditCard)被解除分配,那么我們就有了這樣的場景,因此設計了無主引用。
謝謝@Bob
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.