安全关键值观察关键path

我正试图在keypaths上实现一个安全的key值。 假设我有一个名为person的数据模型对象,它具有workplace属性。 workplace又有一个address属性,我希望遵守,所以我build立了关键的价值观观,以下呼吁:

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

这工作正常,直到人不换工作场所。 一旦发生这种情况:

 person.workplace = newWorkplace; 

KVC系统正确地崩溃了应用程序,说“oldAddress被释放,而关键值观察者仍然注册”。 (旧地址是以前工作地点的地址)。

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

编辑2

花了一些时间与KVO后,我发现你的情况,你应该观察person.workplace.address而不是workplace.address 。 当你观察person.workplace.address ,你实现了两件事:

1)由于您拥有person对象,因此您可以绝对控制对象的生命周期。 您现在可以在您自己select的时间移除Observer。

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

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

编辑1

将KVO属性的对象作为观察者移除的最佳做法

在这个线程接受的答案最好地描述你的情况。 你不应该首先观察房产address ,因为你无法控制workplace的生命周期。 你有一个devise问题。

原版的

您可以观察person对象上的keyPath workplace 。 当这个keyPath被调用时,你只需删除observer for workplace.address

[person addObserver:theObserver forKeyPath:@“workplace”选项:[NSKeyValueObservingOptionNew] context:NULL];