簡體   English   中英

Swift中的自我和無主自我有什么區別?

[英]What is the difference between self and unowned self in Swift?

我想知道以下兩個表達式之間有什么區別?

foregroundNotification = NSNotificationCenter.defaultCenter().addObserverForName(UIApplicationWillEnterForegroundNotification, object: nil, queue: NSOperationQueue.mainQueue(), usingBlock: { 
  (notification:NSNotification!) -> Void in
   // do something
})

和(具有unowned self ):

foregroundNotification = NSNotificationCenter.defaultCenter().addObserverForName(UIApplicationWillEnterForegroundNotification, object: nil, queue: NSOperationQueue.mainQueue(), usingBlock: { 
  [unowned self] (notification:NSNotification!) -> Void in
   // do something
})

快速內存管理通過引用計數執行。 您可以在Swift官方文檔中閱讀引用計數及其含義的摘要。

但是,總而言之–引用計數內存管理的問題是存在引用循環的風險–對象A持有對對象B的引用,而對象B持有對對象A的引用。即使沒有人使用對象A或對象A,不管怎樣,它們彼此保持活動狀態,從而防止釋放內存,調用其deinit方法等。

Swift中的引用循環有兩種解決方案–弱引用和無主引用。

弱引用不計入對象的引用計數。 因此,如果對象B僅具有對對象A的弱引用,則當除去所有其他強引用時,對象A將被破壞。 顯然,風險是對象B可能然后嘗試使用對象A。這就是為什么在Swift中弱引用是可選的–您必須拆開它們(返回強引用而不是弱引用)以檢查所引用的對象是否仍然存在那里。

無主引用的相似之處在於它們不會導致對象被保留。 但是,與弱引用不同,它們不是可選的,不需要首先進行檢查。 相反,從文檔中:

如果在釋放引用所引用的實例后嘗試訪問未擁有的引用,則會觸發運行時錯誤。 僅當確定引用將始終引用實例時,才使用無主引用。

還要注意,Swift保證如果您釋放引用后的實例后嘗試訪問未擁有的引用,則應用程序將崩潰。 在這種情況下,您將永遠不會遇到意外的行為。 您的應用將始終可靠地崩潰,盡管您當然應該防止崩潰。

這意味着您僅應在基於程序邏輯的情況下使用它們,在擁有無主引用的對象之前,無主對象絕不會被銷毀。 在斯威夫特文檔的例子是一個CustomerCreditCard -信用卡是從來不知道沒有一個客戶存在,因此它可以有一個無主的參照其客戶,而不該客戶的風險被破壞,而信用卡仍然在采用。

除了更易於使用(無需拆包)之外,無主引用還具有較低的總體開銷,因此存在一定的風險/回報回報。 即使弱引用不會增加對象的引用計數,但它們仍然需要某種程度的跟蹤,因此較少需要無人引用。

暫無
暫無

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

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