我怀疑你误解了-observationInfo
/的目的-setObservationInfo:
。通过这些方法设置和获取的值对您来说是不透明的。换句话说,它的内容是系统框架私有的,你不打算访问/解析它。您摘录的文档中的评论是:
为了提高性能,可以重写此方法和 setObservationInfo: 以将不透明数据指针存储在实例变量中。此方法的覆盖不得尝试将 Objective-C 消息发送到存储的数据,包括保留和释放。
让我试着澄清一下这是在说什么:
对于每个观察,框架都需要跟踪一些关于观察的私有数据,以便以后交付。没有记录它如何存储这些信息,但从概念上讲,它可能存储在一个映射中,其中键是对象的指针值,值是这个不透明的数据结构。
在特定的、对性能敏感的情况下,可能是在共享地图中查找观察信息会显着影响性能(我自己从未在分析跟踪上看到过这种情况,但这并不是说它不会发生) . 在这些情况下,最好将指针直接作为实例变量存储在对象中,这会将 fetch 操作从 map-lookup 更改为简单的 add。从系统框架的角度来看,我敢打赌,地图查找成本通常远没有替代方案那么繁琐(在大图中),替代方案是为此目的在 NSObject 中放置一个实例变量(这将使每个对象 8无论是否使用 KVO,字节都更大——看起来很简单。)
-observationInfo
/-setObservationInfo:
存在以允许您进行优化。如果您实施了这种优化,这些方法也将是一种了解您的对象是否被观察的方法(即信息值nil
?),这可能允许您对对象的行为进行其他更改。
如果您需要保留一个观察对象列表以及关于它们出于其他目的观察什么的详细信息,那么您需要自己通过重写addObserver:...
andremoveObserver:...
并添加代码来维护您自己的数据私有结构(同时仍然打电话super
。)