gpt4 book ai didi

objective-c - 当路径上的对象可能发生变化时,观察 keyPath 是否安全?

转载 作者:太空狗 更新时间:2023-10-30 04:02:07 25 4
gpt4 key购买 nike

这样实现 KVO 是否安全:

[self addObserver:self
forKeyPath:@"restaurant.oldestOrder.patron.frustrationLevel"
options:0 context:nil];

…当您知道 oldestOrder 可能会更改或变为 nil,并且之前的 oldestOrders 可能会被释放时?

最佳答案

执行摘要:

你永远不需要为同一个键添加两次观察者,只是因为中间的键发生了变化,NSKeyValueObserving 会为你做这件事。

只要您的 -oldestOrder 方法不返回悬挂指针,就不会出现任何问题。


KVO 的工作方式是当您将自己添加为观察者时,观察者会以 NSObservationInfo 对象的形式添加到被观察对象的列表中。简单的。 NSObservationInfo 对象只是一个原始键(不是路径)、一个要观察的对象、一个要调用的观察者、一个指向您传递的上下文的指针,以及一些其他簿记内容。

当您观察键的路径时,观察者关系是通过相应的 NSObservationInfo 对象观察的,这些对象保存在被调用对象的列表中,就好像整个路径是对象的属性一样你调用了 -addObserver

在您的示例中,self 观察到 restaurant,但是 addObserver: 方法随后在后台创建了 NSObservationInfo 对象被添加为路径中每个相应对象的观察者,并且这些也被添加到您自己的观察者列表中。

当您观察对象的 @"A.B.C.D" 时,它会创建四个 NSObservationInfo 对象,每个对象对应一个键关系,并将它们添加到路径上的每个键作为一个观察者,所以你得到一个 NSObservationInfo 对象监视被调用的 A,一个监视 AB,一个正在观看 BC 等。当这些 NSObservationInfo 对象之一观察到变化时,它会将此传递给原始的 -addObserver 调用者对整个 键路径的更改。

(这是一个实现细节,但它应该有助于解释。)

当路径中间的对象被 nil'd 或删除时,-willChangeValueForKey 注意到这一点,并尽职地删除作为观察者的 NSObservationInfo 对象,沿着之后的路径零对象。这些 NSObservationInfo 对象仍然存在,并且它们仍然知道他们想要查看哪些键,并且当 -didChangeValueForKey 被调用时,它将查看键的新值并且如果它的键名与它正在寻找的 NSObservationInfo 对象链相匹配,它会将它们附加为新的观察者。

因此,当路径 @"restaurant.oldestOrder.patron.frustrationLevel" 上的任何元素发生更改时,您将收到更改通知,但 NSKeyValueObserving 机制将尝试在更改以及任何后续更改之后重新建立与该路径末尾的 key 的关系。

这是 Cocoatron's implementation of this ,您可以自己看看它是如何工作的。

关于objective-c - 当路径上的对象可能发生变化时,观察 keyPath 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16533138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com