键值当观察对象被释放时,观察removeObserver

时间:2012-01-31 08:51:53

标签: iphone objective-c ios key-value-observing

有很多与此主题相关的问题,但没有一个问题可以回答我的问题。

当对象被释放时,我希望从对象removeObserver。我正在使用KVO,因为需要观察多个项目,NSNotification在这种情况下会有巨大的开销。

以下是该方案:

(多个)对象被各种其他对象观察到。当observer被取消分配时,我可以将其作为观察者删除。但是当observed被解除分配时,我需要告诉所有observers将自己移除为观察者。怎么做?

3 个答案:

答案 0 :(得分:3)

Sailesh如果对象(观察到的)被解除分配,那么该对象不能被更改或者它的值不能被更改,所以如果您的观察者正在观察一个被释放的对象并且该解除分配的对象永远不会发送任何类型的观察通知那么删除观察者有没有乐趣?
~~~~~~~~~~~~~~~~~~~~~编辑~~~~~~~~~~~~~~~~~~~~~~~~
嘿,我从here得到了一些东西。这个想法是你观察一个额外的属性说alive并写入dealloc被观察为alive = NO;,并且当这个属性被改变时,所有观察者都会得到通知,因此你可以删除所有的观察者。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~

答案 1 :(得分:2)

我认为这里存在设计问题。观察对象不应该关心它的观察者。你说你想从观察对象dealloc方法中删除观察者。但为什么要解除分配呢?如果仍然观察到某个地方存在所有权,那么该对象将不会被解除分配。良好的设计导致dealloc被调用时没有留下任何观察者。

想象一个将自身注册为模型对象的观察者的视图。此模型对象要么保留在视图中,要么保留在控制器中。只要模型对象保留在某处,它就不会调用它的dealloc。只有在最后一个所有权被释放时,才应该调用dealloc。所以说除了view / viewcontroller之外,所有的所有权都被释放了,剩下一个观察者(视图)。现在,在view / viewcontroller释放其对模型对象的所有权之前,它还应该以观察者的身份删除视图。因此,在调用dealloc方法时,应该没有观察者。

答案 2 :(得分:1)

您可以在观察到已取消分配时单独发布来自-(void)dealloc的通知。收到所有其他观察员后,将删除所需的通知。