簡體   English   中英

應該重寫 deinit 以刪除 Swift 中的觀察者嗎?

[英]Should deinit be overridden to remove observers in Swift?

隊友寫的代碼像,

deinit {
    NotificationCenter.default.removeObserver(self)
}

我評論刪除了這個,因為觀察者已經被框架照顧了。 如果沒有副作用,隊友希望保留此代碼。 現在,即使我們保留上面的代碼是否有任何副作用?

我還應該在 deinit 中調用super.deinit()嗎?

從 iOS 9 開始,如果您不使用基於塊的觀察者,則不需要自己刪除觀察者。 系統會為你做這件事,因為它可以為觀察者使用歸零弱引用。

如果觀察者能夠被存儲為一個清零弱引用,底層存儲會將觀察者存儲為一個清零弱引用,或者如果對象不能弱存儲(即它有一個自定義的保留/釋放機制,會阻止運行時從能夠弱地存儲對象)它將對象存儲為非弱置零引用。 這意味着觀察者不需要在他們的解除分配方法中取消注冊。

基於塊的觀察者通過 -[NSNotificationCenter addObserverForName: object: queue: usingBlock] 方法在不再使用時仍然需要取消注冊,因為系統仍然持有對這些觀察者的強引用。

蘋果文檔

和 super.deinit() 蘋果說

析構器會在實例釋放發生之前自動調用。 不允許您自己調用析構器。 超類析構器由它們的子類繼承,並且在子類析構器實現結束時自動調用超類析構器。 總是調用超類析構器,即使子類不提供自己的析構器。

快速文檔

是的,可以覆蓋

deinit()

正如評論中指出的那樣。 不需要調用超級。 我在 Apples 文檔中確認了這一點。

明確清理是一個好主意imo。 尤其是在線程、通知和計時器方面。

暫無
暫無

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

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