我是addObserver:selector:name:object:
中的viewDidLoad
。
我在removeObserver:name:object:
中使用viewWillDisappear:animated:
删除了观察者。
如果我通过将错误的参数传递给removeObserver:name:object:
来删除观察者,会发生什么?
(例如,如果我将错误的通知传递给参数name
或错误的对象传递给object
或Observer
),则不会删除观察者
如果在调用removeObserver:name:object:
后观察者仍然没有nil,我可以发现删除观察者失败,因为将调用notificationSelector。
但是如果观察者在调用removeObserver:name:object:
后变为零,我就无法确定是否删除观察者是否失败。
当观察者变为零时,观察者会自动移除吗?
或notification dispatch table
的{{1}}变得越来越大,最终应用程序会变慢?
修改
当我使用UIViewController对象的子类作为观察者时,在调用ViewController的NSNotificationCenter
后应用程序不会崩溃。
但是当我使用其他类的对象时,应用程序会在调用对象dealloc
后崩溃。
答案 0 :(得分:10)
更新:来自-[NotificationCenter removeObserver:]
:
如果您的应用面向iOS 9.0及更高版本或macOS 10.11及更高版本,则无需在其
dealloc
方法中取消注册观察者。否则,您应该在观察者或removeObserver:name:object:
或addObserverForName:object:queue:usingBlock:
中指定的任何对象被解除分配之前调用此方法或addObserver:selector:name:object:
。
旧回答:
不会自动删除观察者。来自NSNotificationCenter类参考:
重要提示:通知中心不会保留其观察员, 因此,您必须确保取消注册观察者(使用 removeObserver:或removeObserver:name:object :)之前 释放。 (如果不这样做,则会产生运行时错误 center向已释放的对象发送消息。)
因此你应该致电
[[NSNotificationCenter defaultCenter] removeObserver:self];
如果你不是100%确定以前没有移除过观察者,那么在dealloc
方法中。
答案 1 :(得分:0)
您只需要为要删除的Observer输入正确的Observer。如果将错误的参数传递给name或object(或nil),接收方将不会将它们用作删除标准。
所有Cocoa程序都有一个默认的NSNotificationCenter,所以一旦你删除了观察者,你就不必担心它会占用更多的内存。