当观察者变为零时,观察者会自动删除吗?

时间:2012-07-18 15:17:38

标签: iphone objective-c ios observer-pattern

我是addObserver:selector:name:object:中的viewDidLoad

我在removeObserver:name:object:中使用viewWillDisappear:animated:删除了观察者。

如果我通过将错误的参数传递给removeObserver:name:object:来删除观察者,会发生什么? (例如,如果我将错误的通知传递给参数name或错误的对象传递给objectObserver),则不会删除观察者

如果在调用removeObserver:name:object:后观察者仍然没有nil,我可以发现删除观察者失败,因为将调用notificationSelector。

但是如果观察者在调用removeObserver:name:object:后变为零,我就无法确定是否删除观察者是否失败。

当观察者变为零时,观察者会自动移除吗? 或notification dispatch table的{​​{1}}变得越来越大,最终应用程序会变慢?

修改

当我使用UIViewController对象的子类作为观察者时,在调用ViewController的NSNotificationCenter后应用程序不会崩溃。
但是当我使用其他类的对象时,应用程序会在调用对象dealloc后崩溃。

2 个答案:

答案 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,所以一旦你删除了观察者,你就不必担心它会占用更多的内存。