iOS

KVO原理总结

2019-03-09  本文已影响10人  Sweet丶

iOS 用什么方式实现对一个对象的KVO?

  1. 利用runtime api动态生成一个子类,并让对象的isa指针指向这个新生成的子类。
  2. 新生成的子类会重写setter方法,当外部调用setter方法修改属性时,会调用新的setter方法,其内部会调用foundation框架的_NSSetxxxValueAndNotify函数,里面的xxx是属性的类型。
  3. 该函数内部有以下调用:willChangeValueForKey: -> 父类原来的setter方法 -> didChangeValueForKey:
  4. didChangeValueForKey: 方法的内部会使属性的监听者们调用每个监听者的方法- (void)observeValueForKeyPath:ofObject:change:context:
  5. 由上可知,如果是自己手动给成员变量赋值,不会调用到setter方法,也就不会触发KVO; 如果要手动触发KVO,需要自己手动调用willChangeValueForKey:didChangeValueForKey: 方法,只调用后者是无效的
上一篇 下一篇

猜你喜欢

热点阅读