最近复习OC底层原理,看到KVO这块,温故而知新。
我们都知道:
能否触发KVO回调,取决于是否调用了willChangeValueForKey:和didChangeValueForKey:这两个方法。而调用Observer的监听方法是在didChangeValueForKey:中进行的。
那为什么只调用didChangeValueForKey:无法成功调用Observer的监听方法呢?
原因:为了在回调中能够提供监听的属性的旧值,在willChangeValueForKey:中,会通过KVC取得旧值。没有取得旧值,调用Observer的监听方法的条件不成立。
关于willChangeValueForKey:中,通过KVC取得旧值:

总结:
能否触发KVO回调,取决于是否调用了willChangeValueForKey:和didChangeValueForKey:这两个方法。其他条件都是基于这两个方法进行衍生。
在willChangeValueForKey:中,通过KVC取得旧值,所以必须满足KVC取值的规则。
在didChangeValueForKey:中,调用Observer的监听方法,所以Observer必须实现监听方法。
网友评论