繁体   English   中英

密钥路径的安全密钥值观察

[英]Safe Key Value Observing of keypaths

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

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

直到此人不更换工作场所,此方法才能正常工作。 一旦发生这种情况:

person.workplace = newWorkplace;

KVC系统正确地崩溃了该应用程序,并说“ oldAddress已被释放,而键值观察者仍在其中注册”。 (为oldAddress以前工作场所的地址)。

不幸的是,我无法调整“人”对象类的实现,以通知观察者工作场所将要消失。 是否有任何模式可以避免此类崩溃? 也许可以收到其他通知? 在KVC中如何遍历密钥路径,您是否可以访问此链?

编辑2

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

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

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

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

编辑1

删除对象作为某些KVO属性的观察者的最佳实践

该线程中可接受的答案最能描述您的情况。 首先,您不应该查看物业address ,因为您无法控制workplace的生命周期。 您有一个设计问题。

原版的

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

[person addObserver:theObserver for KeyPath:@“ workplace”选项:[NSKeyValueObservingOptionNew]上下文:NULL];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM