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处被释放的对象具有相同的地址;
现在观察者将对第二个对象发布的通知做出反应。
我承认这是一个非常罕见的情况,但它可能会发生,所以你最好针对它编写代码。
如果不移除observer,可能会导致这样的情况:当你已经销毁了一个对象,但它仍然在发送通知——这将导致"message sent to deallocated instance"错误