[英]where should i put removeObserver in AppDelegate.m, ios
[英]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.