KVO的中间人是谁?

171 阅读1分钟

问题:

  1. iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?)
  • 利用RuntimeAPI动态生成一个子类,类名为NSKVONotifying_原来的类名,并且让instance对象的isa指向这个全新的子类
  • 该子类的superclas指针指向原来的类对象
  • 重写了class方法,会返回原来类的class对象
  • 重写了delloc方法
  • 重写类set方法,该方法会调用Foundation的_NSSetXXXValueAndNotify函数
  • _NSSetXXXValueAndNotify中会调用
  • willChangeValueForKey:
  • 原来类对象的set方法
  • didChangeValueForKey:,该方法内会触发监听器(Oberser)的监听方法( observeValueForKeyPath:ofObject:change:context:
  1. 如何手动触发KVO?
  • 手动调用willChangeValueForKey:didChangeValueForKey:一起调用即可,不可少
  1. 直接修改成员变量会触发KVO么?
  • 不会,比如_name=@"123"并不会触发set方法,所以不会触发kvo