3

我正在addObserver:selector:name:object:使用viewDidLoad

我正在使用removeObserver:name:object:inviewWillDisappear:animated:删除观察者。

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

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

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

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

编辑

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

4

2 回答 2

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:)。(如果不这样做,如果中心向已释放的对象发送消息,则会生成运行时错误。)

因此,您应该致电

[[NSNotificationCenter defaultCenter] removeObserver:self];

dealloc如果您不能 100% 确定之前没有删除观察者,请在您的方法中使用。

于 2012-07-18T15:33:13.300 回答
0

您只需要放入正确的观察者即可删除观察者。如果您将错误的参数传递给 name 或 object(或 nil),接收器将不会将它们用作删除标准。

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

于 2012-07-18T15:36:04.353 回答