在UIViewController中添加和删除NSNotificationCenter的观察者

Und*_*ion 17 objective-c addobserver dealloc nsnotificationcenter ios

查看各种Apple示例(例如" 添加音乐"),其中我看到它们将观察者添加到默认值NSNotificationCenterviewDidLoad,然后将其删除dealloc.这看起来很危险,viewDidLoad可以多次dealloc调用而不需要调用.然后,这将多次添加相同的观察者,导致多次调用处理程序.

解决这个问题的方法是删除观察者viewDidUnload,但这意味着同一个观察者可能会被移除第二次,dealloc这似乎是一个潜在的问题.

我错过了什么?

Lor*_*o B 24

关于以正确方式删除通知的讨论很多.例如:

我建议你删除viewWillDisappear(或viewDidDisappear)和viewDidUnload生命周期方法中的观察者.(注意: viewDidUnload已弃用,不应在iOS6 +中实现;请参阅iOS 6 - viewDidUnload migrate to didReceiveMemoryWarning?)

一个重要的说明:

viewDidUnload 不保证被调用 - 它不是标准的生命周期方法.

来自Apple doc:

viewDidUnload当出现内存不足的情况并且不需要当前视图控制器的视图时,系统可能会选择从内存中删除这些视图.在视图控制器的视图发布后调用此方法,并且您有机会执行任何最终清理.

相反,dealloc只要该接收器的引用数为零,就会调用它.

希望能帮助到你.

编辑

为了完整起见,您可以看到有关如何避免-nsnotification-removeobserver的链接.该链接提供了一些有用的指导来删除观察者(另请参阅注释).作者在viewDidAppear/ viewDidDisappearmethods 中使用它,viewWillAppear并且viewWillDisappear在许多应用程序中并不总是正确调用.这是你的选择.

如果您想确保以正确的方式删除观察者,请在方法中取消注册,dealloc或者在第二个注释中写入时完全卸载视图.但请确保dealloc将来会打电话.换句话说,正如我已经提到的,如果控制器继续保持活动状态,因为其他一些对象已经引用它,那么该方法永远不会被调用.在这种情况下,控制器继续接收通知.