2012-07-18 80 views
3

我是uisng addObserver:selector:name:object:viewDidLoad当观察者变为零时观察者会自动移除吗?

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

如果我通过将错误的参数传递给removeObserver:name:object:而导致观察者失败,会发生什么?
(例如,观察者不会被删除,如果我错了传递通知参数name或错对象objectObserver

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

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

当观察者变为零时,观察者会自动删除吗?
还是notification dispatch tableNSNotificationCenter变得越来越大,最终该应用程序变得缓慢?

编辑

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

回答

10

更新:-[NotificationCenter removeObserver:]

如果您的应用程序的目标的iOS 9.0及更高版本或MacOS的10.11及更高版本,你不需要在它dealloc方法来注销一个观察者。否则,在观察者或addObserverForName:object:queue:usingBlock:addObserver:selector:name:object:中指定的任何对象被释放之前,应该调用此方法或removeObserver:name:object:

老答案:

观察员不会自动删除。从NSNotificationCenter类参考:

重要提示:通知中心不保留其观察员, 因此,你必须确保注销观察员(使用 removeObserver:或removeObserver:名称:对象:)他们是 前释放。 (如果你不这样做,你会如果 中心将消息发送到释放对象生成运行时错误。)

因此,应该呼吁

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

dealloc方法,如果你是不是100%确定观察员以前未被移除。

+0

谢谢。我发现如果我使用UIViewController的子类作为观察者,运行时错误不会发生。如果我使用其他类的对象作为观察者,则会发生运行时错误。也许,UIViewController在'dealloc'中调用'removeObserver:self'。但我不知道如何检查超级类是否真的删除了观察者。 – 2012-07-19 10:50:45

+0

我从(?)引用中搜索了引用,但找不到它,因此这可能是旧信息。现在看来在这个时候这仍然是正确的; NSNotificationCenter不会保留观察者,因为我将dealloc调用到某个对象上,而无需将其作为观察者移除。现在,当然,正确的做法是按照这个答案在dealloc中删除它。尽管如此,文件并没有说明观察员是否被保留,因此有点不清楚海事组织。 – Jonny 2014-04-09 02:53:31

0

你只需要把Observer的正确Observer删除就可以了。如果您将错误的参数传递给名称或对象(或无),则接收方不会将它们用作删除条件。

所有的Cocoa程序都有一个默认的NSNotificationCenter,所以一旦你删除了观察者,你不必担心它占用更多的内存。