向NSNotificationCenter添加/删除观察者的最佳实践

时间:2012-01-01 16:40:45

标签: ios dealloc viewdidload nsnotificationcenter viewdidunload

NSNotificationCenter添加和删除观察者的最佳做法是什么?

我想知道在self中添加viewDidLoad作为观察者并在self中删除viewDidUnload是否足够。或者我也应该删除self中的dealloc

可能需要考虑低内存条件。我可以看到添加viewDidLoad并删除dealloc存在问题:由于内存不足而调用viewDidUnload ...然后再次显示视图时调用viewDidLoad。 ..现在self作为观察者被添加了两次没被删除(因为dealloc没有被调用)。

注意:我正在考虑self引用UIViewController子类的基本示例。

2 个答案:

答案 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