调用属性 setter 时响应数据更改的最佳方式是什么。例如,如果我有一个名为 data
的属性,当 [object setData:newData]
被调用时我该如何 react 并仍然使用合成的 setter。本能地,我会像这样覆盖合成的 setter:
- (void)setData:(DataObject *)newData {
// defer to synthesised setter
[super setData:newData];
// react to new data
...
}
...但这当然没有意义 - 我不能像这样使用 super
。那么处理这种情况的最佳方法是什么?我应该使用 KVO 吗?还是别的?
最佳答案
有几种不同的方法可以做到这一点,具体取决于您想要的控制程度。一种方法是观察您自己的属性(property):
[self addObserver:self forKeyPath:@"data" options:0 context:nil];
- (void)observeValueForKeyPath:(NSString *)path ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if(object == self && [path isEqualToString:@"data"]) {
//handle change here
} else [super observeValueForKeyPath:path ofObject:object change:change context:context];
}
确保在 dealloc 或 finalize 方法中将自己作为观察者移除,如果不是之前的话。
另一种方法是覆盖 -didChangeValueForKey:
。但是,如果对象上没有观察者,则可能不会调用此方法。
- (void)didChangeValueForKey:(NSString *)key {
[super didChangeValueForKey:key];
if([key isEqualToString:@"data"]) {
//handle change here
}
}
关于objective-c - 回应二传手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4710340/