2009-07-02 50 views
4

我被KVC/KVO迷住了。超强大。但有一个问题。我试图成为真正的MVC etho,但我没有办法使用观察模式来监视Objective-C类实例的分配或释放。如何观察对象实例的创建/销毁?

这实际上很重要,因为我有一个模型,它具有我想从控制器(或委托人)观察到的细密内部消息传递。对我来说,绊脚石是我看不到模型外部的一个子组件如何在没有控制器了解模型的内部逻辑的情况下释放子组件,而这些子组件将会被释放,从而危害封装。

有人可以为这种情况提出一种方法。

感谢, 道格

回答

6

道格 - 是不是真的有足够的信息,在你的描述就知道这是你在做什么以及如何最好地(或者它是否适合在所有)申请志愿的问题。

KVO是关于观察对象的属性。除非在销毁之前必须停止观察它们,否则通常不应该在乎它们何时被创建或销毁。

您应该在这些对象变得对您感兴趣时启动并停止观察对象。考虑一个图形绘制包,其中文档具有有序的形状数组,并且您有兴趣观察每个形状的backgroundColor属性。

我们不会试图观察实例化和形状实例的释放,而是我们观察该文档的“形状”属性。通过该观察者,我们可以确定何时将图形添加到文档或从中删除。当一个形状被添加到文档中时,我们开始观察它。当它从文档中删除时,我们停止观察它。 (请注意,它可能会从文档中删除,但不会释放,如果它位于撤消堆栈等)

在模型的对象图中,要使用KVO,您需要添加和删除对象从符合KVO标准的对象图中,您可以观察关系突变,并在该观察者中启动和停止有关对象的属性观察器。

+0

你钉了吉姆。 感谢您的澄清。我完全忽略了这样一个事实,即它是指我应该观察的实例本身而不是实例本身的实例。此外,使用点syntac - grandparent.parent.child - 我可以观察对象图中的任何内容。 我假设有观察收藏品的KVO模式,是吗? 2竖起大拇指。 -Doug – dugla 2009-07-02 23:11:58

1

我认为你必须自己发布通知,除非你使用像CoreData。如果您使用的是CoreData,则NSManagedObject(所有存储的CoreData对象的根类)具有-awakeFromInsert方法,该方法在创建对象并将其插入ManagedObjectContext后会被调用。

至于销毁,您可能只需在输入-dealloc方法时发布通知即可。

0

我不确定你想要达到什么目标,所以多一点解释会很好。

如果您只是想在观察对象被释放之前移除观察者,那么请不要担心,因为KVO会处理它。即使您使用通知,也不会导致问题,您只会收到来自对象的任何通知。

如果您尝试观察多个对象(例如一个Widgets数组),并想知道何时添加或删除对象,那么KVO也可以处理该对象。您只需将阵列作为模型对象的关键点,然后使用KVO观察它。您还必须以符合KVO的方式修改阵列(例如mutableArrayForKey:或使用您自己的willChangeValueForKey和didChangeValueForKey)。

+0

谢谢汤姆。非常有帮助。干杯。 – dugla 2009-07-02 23:13:32