3

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

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

苹果文档说

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

所以我知道它可以做到..我的问题是怎么做?我在网上看不到任何信息。

4

4 回答 4

7

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

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

让我试着澄清一下这是在说什么:

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

在特定的、对性能敏感的情况下,可能是在共享地图中查找观察信息会显着影响性能(我自己从未在分析跟踪上看到过这种情况,但这并不是说它不会发生) . 在这些情况下,最好将指针直接作为实例变量存储在对象中,这会将 fetch 操作从 map-lookup 更改为简单的 add。从系统框架的角度来看,我敢打赌,地图查找成本通常远没有替代方案那么繁琐(在大图中),替代方案是为此目的在 NSObject 中放置一个实例变量(这将使每个对象 8无论是否使用 KVO,字节都更大——看起来很简单。)

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

如果您需要保留一个观察对象列表以及关于它们出于其他目的观察什么的详细信息,那么您需要自己通过重写addObserver:...andremoveObserver:...并添加代码来维护您自己的数据私有结构(同时仍然打电话super。)

于 2013-07-15T14:16:14.143 回答
0
id aInstance = (__bridge id)self.observationInfo;
NSArray *list = [aInstance valueForKey:@"_observances"];
for (id object in list) {
    id observer = [object valueForKey:@"_observer"];
    //id property = [object valueForKey:@"_property"];
    //NSString *keyPath = [property valueForKey:@"_keyPath"];
    NSString *keyPath = [object valueForKeyPath:@"_property._keyPath"];
    [self.stone removeObserver:observer forKeyPath:keyPath];

    NSLog(@"%@ %@", observer, keyPath);
}
于 2021-02-03T08:40:27.180 回答
0

这对我有用。

id anObserver = self;
NSString *observerString = [anObserver description];
NSString *str = [NSString stringWithFormat: @"%@", [aController observationInfo]];
NSRange rangeOfObserver = [str rangeOfString:observerString];
if (rangeOfObserver.location == NSNotFound) {
} else {
    [aController removeObserver:anObserver forKeyPath:@"selectionIndexes" context:NULL];
}
于 2020-06-21T20:18:05.510 回答
-1

您正在观察的对象必须符合 KVO。这意味着您可以通过普通字典语法访问相关信息。例如:

[self.something addObserver:self
                  forKeyPath:@"cheese"
                     options:NSKeyValueObservingOptionNew
                     context:NULL];

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context
{

  if ([keyPath isEqualToString:@"cheese"])
  {
    // Get the new key value
    [object valueForKey:keyPath];

    // See the changes for the key value
    NSLog(@"Changes: %@", change);
  }
  else
  {
    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
  }
}

Apple 的 KVO 文档。

于 2013-07-11T18:17:42.317 回答