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:

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

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

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

转载于:https://juejin.im/post/5bd1223151882528cf0a7edb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值