为什么我需要在我正在观察的对象被解除分配之前删除通知观察者?

时间:2013-01-05 09:59:48

标签: cocoa-touch nsnotificationcenter

来自https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/Reference/Reference.html

  

必须在指定的任何对象之前调用removeObserver:或removeObserver:name:object :.   addObserverForName:object:queue:usingBlock:is deallocated

为什么在我正在观察的通知被解除分配之前停止观察是否重要?我明白为什么因为观察者需要停止观察是否会消失而且该块依赖于我的存在,但我不明白为什么生命周期被观察的物体很重要。我误解了这个吗?

2 个答案:

答案 0 :(得分:6)

  

我明白为什么我作为观察者需要停止观察我是否会消失而且阻止取决于我的存在,但我不明白为什么被观察物体的寿命很重要。

我认为可能的解释如下。

addObserverForName:object:queue:usingBlock说明:

  

在接收者的调度表中添加一个条目,其中包含一个通知队列和一个要添加到队列的块,以及可选条件:通知名称和发件人。

此上下文中的

“sender”只是object参数的另一个名称,在以下术语中对其进行了描述:

  

要将其块添加到操作队列的通知的对象。   如果您传递nil,通知中心不会使用通知的发件人来决定是否将该块添加到操作队列。

因此,object充当一种过滤器:当收到通知时,通知中心根据该值(如果存在)决定是否必须将该块添加到指定的操作队列。

现在,请考虑一下:

  1. 在没有移除观察者的情况下取消分配观察对象;

  2. 创建了一个不同的对象,也可以发布通知,并且它发生的地址与在第1点解除分配的对象具有相同的地址;

  3. 现在,观察者将对第二个对象发布的通知作出反应。

  4. 我承认这是一个非常罕见的情况,但可能会发生,所以你最好对它进行编码。

答案 1 :(得分:-1)

如果你不删除观察者,它可能会导致你已经销毁了一个对象但仍然发送通知的情况 - 这将导致“消息发送到解除分配的实例”错误