我被 KVC/KVO 迷住了。超级强大。不过有一个问题。我试图成为真正的 MVC 精神,但我认为没有办法使用观察模式来监视 Objective-C 类实例的分配或解除分配。
这实际上很重要,因为我有一个模型,其中包含我想从控制器(或委托)观察到的细粒度内部消息。对我来说,绊脚石是我不知道如何在模型外部为即将被释放的子组件移除观察者,而控制器不知道模型的内部逻辑会危及封装。
有人可以为这种情况提出一种方法。
谢谢,道格
我被 KVC/KVO 迷住了。超级强大。不过有一个问题。我试图成为真正的 MVC 精神,但我认为没有办法使用观察模式来监视 Objective-C 类实例的分配或解除分配。
这实际上很重要,因为我有一个模型,其中包含我想从控制器(或委托)观察到的细粒度内部消息。对我来说,绊脚石是我不知道如何在模型外部为即将被释放的子组件移除观察者,而控制器不知道模型的内部逻辑会危及封装。
有人可以为这种情况提出一种方法。
谢谢,道格
Doug - 您的描述中确实没有足够的信息来了解您正在做什么以及如何最好(或者如果它完全合适)将 KVO 应用于问题。
KVO 就是观察对象的属性。您通常不应该关心它们何时被创建或销毁,除非您必须在它们被销毁之前停止观察它们。
相反,当您对这些对象感兴趣时,您应该开始和停止观察这些对象。考虑一个图形绘图包,其中文档具有有序的形状数组,并且您有兴趣观察每个形状的 backgroundColor 属性。
我们不会尝试观察 Shape 实例的实例化和释放,而是观察文档上的“shapes”属性。通过该观察者,我们可以确定何时将形状添加到文档中或从文档中删除。当一个形状被添加到文档中时,我们开始观察它。当它从文档中移除时,我们停止观察它。(请注意,如果它在撤消堆栈上等,它可能会从文档中删除但不会被释放。)
在模型的对象图中,要使用 KVO,您需要以符合 KVO 的方式从对象图中添加和删除对象,以便您可以观察关系突变,并在该观察者中,启动和停止属性观察者相关对象。
我认为您必须自己发布通知,除非您使用 CoreData 之类的东西。如果您使用 CoreData,NSManagedObject(所有存储的 CoreData 对象的根类)有一个 -awakeFromInsert 方法,该方法在对象创建并插入到 ManagedObjectContext 后被调用。
至于销毁,您可能只需在输入 -dealloc 方法时发布通知即可。
我不确定你到底想要达到什么目标,所以多一点解释会很好。
如果你只是想在被观察对象被释放之前移除一个观察者,那么不用担心,因为 KVO 会处理它。即使您正在使用通知,它也不会导致问题,您只是不会收到来自该对象的任何通知。
如果您尝试观察多个对象(例如,Widget 数组),并且想知道何时添加或删除对象,KVO 也可以处理。您只需将数组作为模型对象上的键,并使用 KVO 观察它。您还必须以符合 KVO 的方式修改数组(例如 mutableArrayForKey:,或使用您自己的 willChangeValueForKey 和 didChangeValueForKey)。