簡體   English   中英

是否應該在 iOS 中使用 removeObserver(self) 刪除通知?

[英]Should notifications be removed using removeObserver(self) in iOS?

是否應該在 iOS 中使用 self 刪除通知?

隊友在viewWillAppear注冊了一個通知,並在viewDidDisappear刪除,例如,

override func viewWillAppear(_ animated: Bool) {
    NotificationCenter.default.addObserver(self, selector: #selector(onDidReceiveData(_:)), name: .didReceiveData, object: API.shared)
}

override func viewDidDisappear(_ animated: Bool) {
    NotificationCenter.default.removeObserver(self)
}

在查看時,我評論並建議刪除帶有顯式名稱的通知而不是用self刪除,因為我認為將來可能需要在viewWillLoad中注冊一些其他通知,這些通知不應受到調用NotificationCenter.default.removeObserver(self)意外或開發人員錯誤。 我的建議是使用刪除觀察者,

override func viewDidDisappear(_ animated: Bool) {
    NotificationCenter.default.removeObserver(self, name:.didReceiveData, object: nil)
}

隊友回復說用NotificationCenter.default.removeObserver(self)刪除是完全可以的,因為我們暫時沒有注冊其他通知。 我正在尋求參考或指導以說服他,為什么使用 name 而不是self明確刪除通知很重要。

Apple 是否有任何關於刪除通知觀察者的最佳實踐的指南?

在 iOS 9 之后,無需移除觀察者,因為 iOS 會從解除分配的 ViewController 中移除觀察者

問題是在viewWillDisappear刪除所有通知是不安全的。 出於明顯的原因,這不是一個好的做法,但沒有記錄在案。 在 iOS 9 之后,沒有必要調用 removeObserver,因為 iOS 不會嘗試通知已釋放的對象。 在您的情況下,即使視圖控制器不可見但存在於導航堆棧中,您也想收聽您應該在deinit執行的deinit

    class ViewController: UIViewController {
    deinit {
     NotificationCenter.default.removeObserver(self, name:.didReceiveData, object: nil)
    }
   }

暫無
暫無

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

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