KVO

KVO的全称是Key-Value Observing,俗称“键值监听”,可以用于监听某个对象属性值的改变

  1. //启动监听:age
  2. [person addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];

对象监听前

image.png

对象实行监听后,利用RuntimeAPI动态生成一个子类,并且让instance对象的isa指向这个全新的子类

image.png

当调用set方法时,会调用内部Foundation的_NSSetXXXValueAndNotify函数:
  • willChangeValueForKey:
  • 父类原来的setter方法
  • didChangeValueForKey:
    • 而这个方法里,内部会触发监听器(Oberser)的监听方法( observeValueForKeyPath:ofObject:change:context:)

      总结一句话:KVO关键就是有没有调用set方法

      因为里面会执行willChangeValueForKey和didChangeValueForKey,两者只有组合在一起才会唤起KVO


      KVC

      KVC的全称是Key-Value Coding,俗称“键值编码”,可以通过一个key来访问某个属性

      setValue:forKey流程图

      image.png

      valueForKey

      image.png

setValue:forKey内部会调用

  • willChangeValueForKey:
  • 父类原来的setter方法(按流程图去走,没有set方法则去成员变量里面找,有就直接赋值->_key)
  • didChangeValueForKey:

    因此KVC是可以触发KVO的