observationInfo
方法返回对象的绑定(bind)信息。我环顾四周,但我不知道如何从字典中获取信息。任何人都可以引导我朝着正确的方向前进吗?
编辑
以防有人误解我的意思。我的类(class)已经全部符合 KVO 标准。现在,在将观察者添加到 something
对象后,self.something
现在将具有绑定(bind)信息。如果我做了 [self.something observationInfo],这将返回一个字典。我想访问该词典的内容。
苹果文档说
For improved performance, this method and setObservationInfo: can be overridden to store the opaque data pointer in an instance variable. Overrides of this method must not attempt to send Objective-C messages to the stored data, including retain and release.
所以我知道这是可以做到的..我的问题是怎么做?我在网上看不到任何信息。
最佳答案
我怀疑您误解了 -observationInfo
/-setObservationInfo:
的用途。通过这些方法设置和获取的值对您来说是不透明的。换句话说,它的内容是系统框架私有(private)的,您不打算访问/解析它。您摘录的文档中的评论是:
For improved performance, this method and setObservationInfo: can be overridden to store the opaque data pointer in an instance variable. Overrides of this method must not attempt to send Objective-C messages to the stored data, including retain and release.
让我试着澄清一下这是什么意思:
对于每一次观察,框架都需要跟踪一些关于观察的私有(private)数据,以便稍后提供。它如何存储该信息没有记录,但从概念上讲,它可能存储在一个映射中,其中键是对象的指针值,值是这个不透明的数据结构。
在特定的、对性能敏感的情况下,可能是在该共享 map 中查找观察信息会显着影响性能(我自己从未见过这种情况出现在分析跟踪中,但这并不是说它不能'不会发生)。在这些情况下,最好将指针直接存储为对象中的实例变量,这会将获取操作从映射查找更改为简单的添加。从系统框架的角度来看,我敢打赌 map 查找成本通常远没有备选方案繁重(在大局中),后者为此目的将一个实例变量放入 NSObject (这将使 每个 对象大 8 个字节,无论它是否使用 KVO —— 看起来很简单。)
-observationInfo
/-setObservationInfo:
存在以允许您进行优化。如果你实现了这个优化,这些方法也将是一种了解你的对象是否被观察的方法(即信息值是 nil
吗?)这可能允许你对你的对象进行其他更改行为。
如果您出于其他目的需要保留观察对象的列表以及它们正在观察的内容的详细信息,那么您将需要自己通过覆盖 addObserver:...
来完成和 removeObserver:...
,并添加代码以维护您自己的数据私有(private)结构(同时仍调用 super
。)
关于objective-c - 我如何从 Objective C KVO 中的 observationInfo 方法获取信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17598944/