可可触摸 - 为什么在解除分配我正在观察的对象之前,我需要删除通知观察器?



From 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

为什么在我正在观察的对象的通知被释放之前我停止观察很重要?我理解为什么作为观察者的I需要停止观察,如果I将消失,阻塞取决于我的存在,但我不理解为什么被观察对象的生命周期如此重要。我误解了吗?

我理解为什么作为观察者的我需要停止观察,如果我要消失,阻塞取决于我的存在,但我不理解为什么被观察对象的生命周期如此重要。

我认为一个可能的解释如下。

addObserverForName:object:queue:usingBlock描述说:

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

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

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

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

现在,考虑这个:

  1. 被观察对象被释放,不需要移除观察者;

  2. 创建了一个不同的对象,也可以发布通知,并且它恰好与在点1处被释放的对象具有相同的地址;

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

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

如果不移除observer,可能会导致这样的情况:当你已经销毁了一个对象,但它仍然在发送通知——这将导致"message sent to deallocated instance"错误

最新更新