3

向/从中添加和删除观察者的最佳做法是什么NSNotificationCenter

我想知道self作为观察者添加viewDidLoad和删除是否selfviewDidUnload足够了。或者也许我也应该删除selfdealloc

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

注意:我只考虑一个基本示例,其中self指的是UIViewController子类。

4

2 回答 2

8

我通常让我的UIViewController观察者注册viewWillAppear和删除viewWillDisappear

viewWillDisappear对我来说似乎是一个更安全的选择,因为后一种方法只在低于 5.0的iOSviewWillUnload版本的低内存情况下调用。

最合适的答案可能取决于您的视图控制器在做什么。您是否希望在您的视图显示之前收到(并且需要做出反应)通知?如果是这样,也许添加观察者viewDidLoad对你来说是正确的。

于 2012-01-01T16:49:14.153 回答
8

对于 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 幻灯片 241

于 2015-10-17T07:53:56.550 回答