[英]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
该线程中可接受的答案最能描述您的情况。 首先,您不应该查看物业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.