如何观察对象实例的创建/销毁?

时间:2009-07-02 21:41:33

标签: objective-c cocoa key-value-observing key-value-coding

我被KVC / KVO迷住了。超级强大。但是有一个问题。我试图成为真正的MVC道德,但我认为没有办法使用观察模式来监视Objective-C类实例的分配或释放。

这实际上很重要,因为我有一个具有细粒度内部消息传递的模型,我想从控制器(或委托)观察。对我来说,绊脚石是我没有看到,在模型外部,我可以删除一个即将被解除分配的子组件的观察者,而控制器不知道模型的内部逻辑会破坏封装。

有人可以为这种情况建议一种方法。

谢谢, 道格

3 个答案:

答案 0 :(得分:6)

道格 - 你的描述中确实没有足够的信息知道你在做什么以及如何做到最好(或者如果它是合适的话)将KVO应用于问题。

KVO就是观察物体上的属性。你通常不应该关心它们的创建或销毁,除非你必须在它们被销毁之前停止观察它们。

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

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

在模型的对象图中,要使用KVO,您需要以符合KVO的方式添加和删除对象图中的对象,以便您可以观察关系突变,并在该观察者中启动和停止属性关于相关对象的观察员。

答案 1 :(得分:1)

我认为你必须自己发布通知,除非你使用像CoreData这样的东西。如果您正在使用CoreData,NSManagedObject(所有存储的CoreData对象的根类)都有一个-awakeFromInsert方法,该方法在创建对象并插入ManagedObjectContext后被调用。

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

答案 2 :(得分:0)

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

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

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