阅读 195

KVO和 KVC

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:forKeyPathsetValue:forKey的区别在于可以查找路径例如(dog.name

7 :setValue:forKey会根据传进来的key来查找方法,按顺序查找,首先会找setKey:,然后再找_setKey:

8:

setValue:forKey的原理

9:setValue:forKey在找不到 set方法的情况下会按_key_isKeykeyisKey的顺序查找,如果找不到就抛出异常

10:KVC 肯定会触发 KVO,KVC内部会做willChangeValueForKeydidChangeValueForKey的操作

11:valueForKey:的方法查找顺序是:getKey,key,isKey,_key