【问题标题】:Safe Key Value Observing of keypaths键路径的安全键值观察
【发布时间】:2016-11-26 08:16:57
【问题描述】:

我正在尝试在键路径上实现一个安全的键值观察。假设我有一个名为person 的数据模型对象,它有一个workplace 属性。 workplace 又具有我希望观察的 address 属性,因此我通过以下调用设置键值观察:

[person addObserver:theObserver 
         forKeyPath:@"workplace.address" 
            options:NSKeyValueObservingOptionNew 
            context:NULL];

在此人不更换工作场所之前,这可以正常工作。一旦发生这种情况:

person.workplace = newWorkplace;

KVC 系统正确地使应用程序崩溃,说“oldAddress 已被释放,而键值观察者仍向其注册”。 (老地址是以前工作单位的地址)。

不幸的是,我无法调整“人”对象类的实现来通知观察者工作场所将要消失。有什么模式可以避免这种崩溃吗?也许可以得到一些其他的通知?在 KVC 的情况下,keypath 是如何遍历的,你是否可以访问这个链?

【问题讨论】:

    标签: ios cocoa key-value-observing


    【解决方案1】:

    编辑 2

    在 KVO 上花费了更多时间后,我发现在您的情况下,您应该观察 person.workplace.address 而不是 workplace.address。当你观察person.workplace.address 时,你实现了两件事:

    1) 由于您拥有person 对象,因此您可以完全控制对象的生命周期。您现在可以在自己选择的时间移除观察者。

    2) 当workplace对象改变时,KVO机制会“自动”观察新workplace的新address。当然,它会通知你新的address

    现在,您可以观察address,而不必担心workplace 会被随机替换。这是 KVO 真正隐藏的力量之一。这允许子类在不知道它们的生命周期的情况下安全地观察任何超类的对象。

    编辑 1

    Best practice to remove an object as observer for some KVO property

    此线程中接受的答案最能描述您的情况。首先,您不应该观察属性address,因为您无法控制workplace 的生命周期。你有一个设计问题。

    原创

    您可以在 person 对象上观察 keyPath workplace。调用此 keyPath 时,您只需 removeObserver for workplace.address

    [人加观察者:观察者 forKeyPath:@"工作场所" 选项:[NSKeyValueObservingOptionNew] 上下文:NULL];

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多