当您观察属性时,我想知道在KVO中应该设置什么上下文指针。我刚开始使用 KVO,从文档中并没有学到太多的东西。我在这个页面上看到: http://www.jakeri.net/2009/12/custom-callout-bubble-in-mkmapview-final-solution/ 作者做了这个:
[annView addObserver:self
forKeyPath:@"selected"
options:NSKeyValueObservingOptionNew
context:GMAP_ANNOTATION_SELECTED];
然后在回调函数中,执行这个操作:
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context{
NSString *action = (NSString*)context;
if([action isEqualToString:GMAP_ANNOTATION_SELECTED]){
我假设在这种情况下,作者只是创建一个字符串以后在回调函数中进行识别。然后我在iOS 5 Pushing the Limits这本书中看到他这样做:[self.target addObserf:self forKeyPath:self.property options:0 context:(__bridge void *)self];
回调函数:
if ((__bridge id)context == self) {
}
else {
[super observeValueForKeyPath .......];
}
我想知道在传入上下文指针时是否有标准或最佳实践?
self
作为上下文的原因是,self
会被子类和父类中的代码共享。例如,如果您有一个超类Person,一个名为Employee的子类以及一个名为Manager的子类,它们都将使用相同的self
。它们可能不应该共享上下文,否则Manager中的未来更改可能会影响Person。 - Steven Fisherself
作为一个指向对象的指针,基本上就是“不私有于它的使用”的定义。所以,是的,有很多理由不要将其用作 KVO 上下文。 - ipmcc