神刀安全网

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的缺陷

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » KVO的缺陷

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
分享按钮