【问题标题】:Will observers automatically removed when observers become nil?当观察者为零时,观察者会自动移除吗?
【发布时间】:2012-07-17 16:25:27
【问题描述】:

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

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

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

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

但是如果观察者在调用removeObserver:name:object:后变为nil,我就无法知道移除观察者是否失败。

观察者变为 nil 时会自动移除观察者吗?
还是notification dispatch tableNSNotificationCenter 变得越来越大,最终导致应用变慢?

编辑

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

【问题讨论】:

    标签: iphone objective-c ios observer-pattern


    【解决方案1】:

    更新:来自-[NotificationCenter removeObserver:]

    如果您的应用面向 iOS 9.0 及更高版本或 macOS 10.11 及更高版本,则无需在其 dealloc 方法中取消注册观察者。否则,您应该在观察者或addObserverForName:object:queue:usingBlock:addObserver:selector:name:object: 中指定的任何对象被释放之前调用此方法或removeObserver:name:object:

    旧答案:

    观察者不会被自动移除。来自 NSNotificationCenter 类参考:

    重要提示:通知中心不保留观察者, 因此,您必须确保取消注册观察者(使用 removeObserver: 或 removeObserver:name:object:) 之前 解除分配。 (如果你不这样做,你会产生一个运行时错误,如果 center 向释放的对象发送消息。)

    因此你应该调用

    [[NSNotificationCenter defaultCenter] removeObserver:self];
    

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

    【讨论】:

    • 谢谢。我发现如果我使用 UIViewController 的子类作为观察者,就不会发生运行时错误。如果我使用其他类的对象作为观察者,则会发生运行时错误。也许,UIViewController 在其dealloc 中调用removeObserver:self。但我不知道如何检查超类是否真的删除了观察者。
    • 我在 (?) 参考资料中搜索了您的报价,但找不到,所以这可能是旧信息。现在看来,目前这仍然是正确的; NSNotificationCenter 不保留观察者,因为我在对象上调用了 dealloc,甚至没有将其作为观察者移除。现在,当然正确的做法是按照这个答案在 dealloc 中删除它。文档仍然没有说明观察者是否被保留,因此 IMO 有点不清楚。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多