如何从Objective C KVO中的observationInfo方法获取信息?

iOS*_*com 3 cocoa binding objective-c key-value-observing

存在observationInfo返回对象的绑定的信息的方法.我环顾四周但我不知道如何从字典中获取信息.任何人都可以带领我朝着正确的方向前进吗?

编辑 以防任何人误解我说的话.我的课程已经全部符合KVO标准.现在,将观察者添加到something对象后,self.something现在将具有绑定信息.如果我做[self.something observationInfo],这将返回一个字典.我想访问该词典的内容.

Apple医生说

为了提高性能,可以重写此方法和setObservationInfo:以将不透明数据指针存储在实例变量中.此方法的覆盖不得尝试将Objective-C消息发送到存储的数据,包括保留和释放.

所以我知道它可以做到......我的问题是如何做到的?我看不到任何信息在线.

ipm*_*mcc 7

我怀疑你误解了-observationInfo/ 的目的-setObservationInfo:.由这些方法设置和获取的值对您来说是不透明的.换句话说,它的内容对系统框架是私有的,并且您不打算能够访问/解析它.您摘录的文档的评论是:

为了提高性能,可以重写此方法和setObservationInfo:以将不透明数据指针存储在实例变量中.此方法的覆盖不得尝试将Objective-C消息发送到存储的数据,包括保留和释放.

让我试着澄清这说些什么:

对于每次观察,框架都需要跟踪一些有关观察的私人数据,以便以后交付.如何存储该信息没有记录,但从概念上讲,它可能存储在一个映射中,其中键是对象的指针值,值是这个不透明的数据结构.

在特定的,对性能敏感的情况下,查找共享地图中的观察信息可能会显着影响性能(我自己从未见过这种情况,但这并不是说它不可能发生) .在这些情况下,最好将指针直接存储为对象中的实例变量,这会将获取操作从映射查找更改为简单添加.从系统框架的角度来看,我敢打赌,地图查找成本通常远远小于替代方案(在大图中),这可能是为了这个目的而在NSObject中放置一个实例变量(这将使每个对象8无论是否使用KVO,字节都更大 - 看起来很简单.)

-observationInfo/ -setObservationInfo:exists允许您进行优化.如果您实现了此优化,这些方法也可以是一种了解您的对象是否被观察的方式(即信息值nil?),这可能允许您对对象的行为进行其他更改.

如果你有一个需要不断观察有关他们正在观察某些其他目的的对象和细节的名单,那么你需要做的是自己通过重写addObserver:...和removeObserver:...,并添加代码,以维护自己的私有数据结构(同时仍打电话super.)