转载

KVO的缺陷

最近用了一些KVO,发现KVO本身有不少缺点,如下列举一二:

糟糕的API

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]; //父类也有可能需要监听  } } 

父类和子类中同时存在KVO,有坑

父类和子类监听了同一个对象的同一个参数时,很容易出现父类在dealloc中remove了一次,子类又remove了一次的情况下。

依赖KVC,这种硬编码的方式,编译期无法检查错误

如上的例子为了防止这一点使用了 NSStringFromSelector 来防止非法的属性,但是这只适用于单层的keyPatch。

比如想监听一个vc的持有的scrollView的属性就不能这么做了。

参考:

KVO的缺陷

原文  http://iJack.pw/2016/04/09/KVO的缺陷/
正文到此结束
Loading...