在Cocoa KVO中,为什么NSMutableArray代理上的更改不会通知观察者?

我正在iOS中实现一个DocumentsManager类,我想创建一个名为documents的to-many属性,使其符合KVO标准。 它似乎主要工作,我的KVO访问器和mutator方法被调用。 然而,困扰我的是,在我的实例上调用mutableArrayValueForKey:返回的NSMutableArray代理上直接进行的任何更改都不会通知观察者。

所以,这段代码通知我关于插入@"aaa"而不是@"bbb"插入,尽管它们实际上都插入到docsProxy中可见。 这是预期的行为吗? 如果是这样,使用mutableArrayValueForKey:方法有什么好处?

 NSMutableArray *docsProxy = [[DocumentsManager instance] mutableArrayValueForKey:@"documents"]; [[DocumentsManager instance] addObserver:self forKeyPath:@"documents" options:NSKeyValueObservingOptionNew context:NULL]; [[DocumentsManager instance] insertObject:@"aaa" inDocumentsAtIndex:0]; // OK [docsProxy insertObject:@"bbb" atIndex:0]; // no notification! 

事实certificate, mutableArrayValueForKey:并不总是返回通知数组。 只有当观察者已经在观察对象上注册时才会这样做!

因此,交换我的前两行可以解决问题:

 [[DocumentsManager instance] addObserver:self forKeyPath:@"documents" options:NSKeyValueObservingOptionNew context:NULL]; NSMutableArray *docsProxy = [[DocumentsManager instance] mutableArrayValueForKey:@"documents"]; 

如果我们能够阅读这些方法的源代码,不禁想到我们节省了多少时间……