2012-01-31 133 views
6

有许多与这个主题相关的问题,但他们都没有回答我的问题。关键值观察对象被释放时观察removeObserver

我想removeObserver从该对象获取释放时的对象。我正在使用KVO,因为需要遵守多个项目,并且在这种情况下NSNotification有巨大的开销。

下面是情形:

(多)的对象由不同的其他对象观察。当observer被取消分配时,我可以将其作为观察者移除。但是当observed得到释放,我需要告诉所有observers作为观察员自己删除。这个怎么做?

回答

1

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

+0

不会有这么多的通知,并且使用kvo的全部目的被击败。而且,它最终会变成:1.观察对象的某些属性。 2.从所有观察对象中,释放时发出通知。 3.听取释放通知并移除观察者。这是很多工作。是不是有一些干净的解决方案? – Sailesh 2012-01-31 09:18:34

3

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


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

+2

在控制台中看到此错误消息后,您想删除Observer,即使它没有乐趣:)。 'MyClass类的实例0xd89f200被释放,而键值观察者仍然注册了它。观察信息被泄漏,甚至可能被误认为是其他物体。“ – Sailesh 2012-01-31 10:18:06

+0

嗯,这是一个严重的东西...让我搜索,如果我能找到东西..感谢您的答复:) – 2012-01-31 10:24:57

+0

我编辑了答案... 。 – 2012-01-31 10:39:56

2

我认为这里有一个设计问题。观察对象不应该关心它的观察者。你说你想从观察对象的dealloc方法中移除观察者。但为什么它会被释放?如果仍然观察到某个地方存在所有权,则该对象不会被处理。在dealloc被调用的时候,没有观察者留下好的设计结果。

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

+0

考虑两个对象相互观察的情况。您建议的设计会创建一个保留周期。无论如何,考虑到应用程序的所有其他方面,观察者可能只会对观察到的参照物产生较弱的参考,否则可能不是一个好设计。 – Sailesh 2012-01-31 10:21:37

+1

在我看来,两个观察对象是一个糟糕的设计。 – 2012-01-31 10:41:41

+0

感谢您的回答。我意识到,我对模型拥有较弱所有权的决定是错误的。现在我转向了一种强大的关系,希望我现在看不到很多KVO崩溃。 – rounak 2014-12-28 19:54:34