最近用了一些KVO,发现KVO本身有不少缺点,如下列举一二:
KVO只有一个方法,也就是说很多时候不得不写一大坨代码来处理监听。如下是一个示例,代码如下:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if(object == _view && [keyPath isEqualToString:NSStringFromSelector(@selector(property))]) { // 确保KVO只响应需要的对象的属性 ... } else{ [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; //父类也有可能需要监听 } }
父类和子类监听了同一个对象的同一个参数时,很容易出现父类在dealloc中remove了一次,子类又remove了一次的情况下。
如上的例子为了防止这一点使用了 NSStringFromSelector
来防止非法的属性,但是这只适用于单层的keyPatch。
比如想监听一个vc的持有的scrollView的属性就不能这么做了。
参考: