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

Aar*_*ron 3 cocoa-touch nsnotificationcenter

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

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

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

ser*_*gio 6

我理解为什么我作为观察者需要停止观察我是否会消失而且块依赖于我的存在,但我不明白为什么被观察物体的寿命很重要.

我认为可能的解释如下.

addObserverForName:object:queue:usingBlock 说明说:

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

此上下文中的"sender"只是object参数的另一个名称,在以下术语中描述:

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

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

现在,考虑一下:

  1. 观察对象被解除分配而观察者不被移除;

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

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

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