iOS基础总结一(KVC、KVO简述)

1.KVC实现原理

  • KVC,键值编码,使用字符串直接访问对象的属性;
  • 底层实现,当一 个对象调用setValue方法时,方法内部会做一下操作:

(1)检查是否存在相应key的set方法,如果存在,就调用set方法;

(2)如果set方法不存在,就会查找与key相同名称且带下划线的成员属性,如果有,则直接给成员属性赋值;

(3)如果没有找到_key,就会查找相同名称的属性key。如果有,就直接赋值;

(4)如果还没有找到,则会调用valueForUndefinedKey:和setValue:forUndefinedKey:方法

2.KVO的实现原理

KVO-键值观察机制,原理如下:

1、当给A类添加KVO的时候,runtime动态的生成了一个子类NSKVONotifying_A,让A类的isa指针指向NSKVONotifying_A类,重写 class方法,隐藏对象的真实类信息;

2、重写坚听属性的setter方法,在setter方法内部调用了Foundation的_NSSetObjectValueAndNotiify函数;

3、_NSSetObectValueAndNotify函数内部过程:

(a)首先会调用willChangeValueForKey;

(b)给属性赋值;

(c)调用diddChangeValueForKey;

(d)调用observer的observerValueForKeyPath去通知监听属性值发生了变化

4、重写dealloc,释放KVO 的内存

3.如何手动触发KVO方法

手动调用willChangeValueForKey 和didChangeValueForKey.

键值观察通知依赖于 NSObject 的两个方法: willChangeValueForKey: 和 didChangeValueForKey。在一个被观察属性发生改变之前, willChangeValueForKey: 一定会被调用,这就 会记录旧的值。而当改变发生后, didChangeValueForKey 会被调用,继而 observeValueForKey:ofObject:change:context: 也会被调用。如果可以手动实现这些调用,就可以实现“手动触发”了 有人可能会问只调用didChangeValueForKey方法可以触发KVO方法,其实是不能的,因为willChangeValueForKey: 记录旧的值,如果不记录旧的值,那就没有改变一说了

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值