Und*_*ion 17 objective-c addobserver dealloc nsnotificationcenter ios
查看各种Apple示例(例如" 添加音乐"),其中我看到它们将观察者添加到默认值NSNotificationCenter
中viewDidLoad
,然后将其删除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
/ viewDidDisappear
methods 中使用它,viewWillAppear
并且viewWillDisappear
在许多应用程序中并不总是正确调用.这是你的选择.
如果您想确保以正确的方式删除观察者,请在方法中取消注册,dealloc
或者在第二个注释中写入时完全卸载视图.但请确保dealloc
将来会打电话.换句话说,正如我已经提到的,如果控制器继续保持活动状态,因为其他一些对象已经引用它,那么该方法永远不会被调用.在这种情况下,控制器继续接收通知.
归档时间: |
|
查看次数: |
20547 次 |
最近记录: |