【问题标题】:How do I observe the creation/destruction of an object instance?如何观察对象实例的创建/销毁?
【发布时间】:2009-07-02 21:41:32
【问题描述】:

我被 KVC/KVO 迷住了。超级强大。不过有一个问题。我试图成为真正的 MVC 精神,但我认为没有办法使用观察模式来监控 Objective-C 类实例的分配或解除分配。

这实际上很重要,因为我有一个模型,我想从控制器(或委托)观察到细粒度的内部消息传递。对我来说,绊脚石是我不知道如何在模型外部为即将被释放的子组件移除观察者,而控制器不知道模型的内部逻辑会危及封装。

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

谢谢, 道格

【问题讨论】:

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


    【解决方案1】:

    Doug - 您的描述中确实没有足够的信息来了解您正在做什么以及如何最好地(或者如果它完全合适)将 KVO 应用于问题。

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

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

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

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

    【讨论】:

    • 你成功了,吉姆。感谢您的澄清。我完全忽略了一个事实,即 ivar 指的是我应该观察的对象的实例,而不是实例本身。此外,使用 dot syntac - grandparent.parent.child - 我可以观察对象图中的任何内容。我假设有一个用于观察集合的 KVO 模式,是吗? 2 个竖起大拇指的吉姆。 -道格
    • 您观察关系的属性。在我的绘图应用程序中,您会观察到“形状”属性。作为文档对象的实现者,我需要确保每次对 _shapes ivar 进行变异时,都以符合 KVO 的方式进行。通读 NSKeyValueObserving.h 以了解您应该将关系突变包含在哪些 KVO 通知中,以及在进行此类突变时您可以在观察者回调中看到哪些信息。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我不确定你想要达到什么目的,所以多解释一下就好了。

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

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

      【讨论】:

      • 谢谢汤姆。也很有帮助。干杯。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-06
      • 1970-01-01
      • 2011-06-02
      相关资源
      最近更新 更多