一个类有一个类型为 NSMutableArray 的属性(和实例变量),带有合成访问器(通过@property
)。如果您使用以下命令观察该数组:
[myObj addObserver:self forKeyPath:@"theArray" options:0 context:NULL];
然后在数组中插入一个对象,如下所示:
[myObj.theArray addObject:NSString.string];
一个observeValueForKeyPath...通知是not发送。但是,以下内容确实发送了正确的通知:
[[myObj mutableArrayValueForKey:@"theArray"] addObject:NSString.string];
这是因为mutableArrayValueForKey
返回一个负责通知观察者的代理对象。
但是合成的访问器不应该自动返回这样的代理对象吗?解决这个问题的正确方法是什么——我应该编写一个只调用的自定义访问器[super mutableArrayValueForKey...]
?
但是合成的访问器不应该自动返回这样的代理对象吗?
No.
解决这个问题的正确方法是什么——我应该编写一个只调用的自定义访问器[super mutableArrayValueForKey...]
?
否。实施数组访问器。当您调用这些时,KVO 将自动发布适当的通知。所以你所要做的就是:
[myObject insertObject:newObject inTheArrayAtIndex:[myObject countOfTheArray]];
正确的事情会自动发生。
为了方便起见,你可以写一个addTheArrayObject:
访问器。该访问器将调用上述实际数组访问器之一:
- (void) addTheArrayObject:(NSObject *) newObject {
[self insertObject:newObject inTheArrayAtIndex:[self countOfTheArray]];
}
(您可以而且应该为数组中的对象填写正确的类,以代替NSObject
.)
然后,代替[myObject insertObject:…]
, 你写[myObject addTheArrayObject:newObject]
.
Sadly, add<Key>Object:
及其对应物remove<Key>Object:
最后我检查了一下,KVO 仅识别集合(如 NSSet 中)属性,而不是数组属性,因此您不会获得免费的 KVO 通知,除非您在它识别的访问器之上实现它们。我提交了一个关于此的错误:x-radar://problem/6407437
I have 所有访问器选择器格式的列表在我的博客上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)