KVO
KVO的全称是Key-Value Observing,俗称“键值监听”,可以用于监听某个对象属性值的改变
//启动监听:age
[person addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];
对象监听前
对象实行监听后,利用RuntimeAPI动态生成一个子类,并且让instance对象的isa指向这个全新的子类
当调用set方法时,会调用内部Foundation的_NSSetXXXValueAndNotify函数:
- willChangeValueForKey:
- 父类原来的setter方法
- didChangeValueForKey:
- 而这个方法里,内部会触发监听器(Oberser)的监听方法( observeValueForKeyPath:ofObject:change:context:)
总结一句话:KVO关键就是有没有调用set方法
因为里面会执行willChangeValueForKey和didChangeValueForKey,两者只有组合在一起才会唤起KVO
KVC
KVC的全称是Key-Value Coding,俗称“键值编码”,可以通过一个key来访问某个属性
setValue:forKey流程图
valueForKey
setValue:forKey内部会调用
- willChangeValueForKey:
- 父类原来的setter方法(按流程图去走,没有set方法则去成员变量里面找,有就直接赋值->_key)
- didChangeValueForKey:
因此KVC是可以触发KVO的