1:实例对象添加了 KVO 监听后, isa 指向的是拥有 NSKVONotfying_前缀的子类对象(runtime 动态生成的)
2:NSKVONotfying子类有自己的 set 方法实现,例如若是监听的属性是 Int 类型,set 方法的对应的内部实现就是一个_NSSetIntValueAndNotify()。
[self willChangeValueForKey:@"age"];
[self setAge:age];
[self didChangeValueForKey:@"age"]
3:didChangeValueForKey 里面调用了监听方法(observeValueForKeyPath)
4:NSKVONotfying子类重写Class 方法的原因是隐藏NSKVONotfying
5:手动触发 KVO 需要调用 willChangeValueForKey 的原因是因为didChangeValueForKey内部会判断willChangeValueForKey是否被调用
6: setValue:forKeyPath和setValue:forKey的区别在于可以查找路径例如(dog.name)
7 :setValue:forKey会根据传进来的key来查找方法,按顺序查找,首先会找setKey:,然后再找_setKey:
8:
9:setValue:forKey在找不到 set方法的情况下会按_key、_isKey、key、isKey的顺序查找,如果找不到就抛出异常
10:KVC 肯定会触发 KVO,KVC内部会做willChangeValueForKey 和didChangeValueForKey的操作
11:valueForKey:的方法查找顺序是:getKey,key,isKey,_key。