在NSNotificationCenter
添加和删除观察者的最佳做法是什么?
我想知道在self
中添加viewDidLoad
作为观察者并在self
中删除viewDidUnload
是否足够。或者我也应该删除self
中的dealloc
。
可能需要考虑低内存条件。我可以看到添加viewDidLoad
并删除dealloc
存在问题:由于内存不足而调用viewDidUnload
...然后再次显示视图时调用viewDidLoad
。 ..现在self
作为观察者被添加了两次没被删除(因为dealloc
没有被调用)。
注意:我正在考虑self
引用UIViewController
子类的基本示例。
答案 0 :(得分:8)
我通常会在UIViewController
中注册我的viewWillAppear
观察者并在viewWillDisappear
中删除。
viewWillDisappear
对我来说似乎比viewWillUnload
更安全,因为后一种方法只能在iOS版本 old 而不是5.0的低内存情况下调用。
最合适的答案可能取决于您的视图控制器正在做什么。您希望在视图显示之前得到(并且需要做出反应)通知吗?如果是这样,可能在viewDidLoad
添加观察者对你来说是正确的。
答案 1 :(得分:5)
对于iOS 9+和OS X 10.11+,WWDC 2015 session 202 "What's New in Cocoa"宣布:
<强> NSNotificationCenter 强>
取消分配的观察员将自动取消注册
let center = NSNotificationCenter.defaultCenter()
center.addObserver(self,
selector: "localeChanged:",
name: NSCurrentLocaleDidChangeNotification,
object: nil)
无需致电
let center = NSNotificationCenter.defaultCenter()
center.removeObserver(self,
name: NSCurrentLocaleDidChangeNotification,
object: nil)
见33:27的视频,pdf slide 241