iOS底层原理 - 《KVO与KVC探索》

KVC简介

KVC(Key-value coding)键值编码
指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值。而不需要调用明确的存取方法。这样就可以在运行时动态地访问和修改对象的属性。

常用方法:

- (nullable id)valueForKey:(NSString *)key;                          //直接通过Key来取值
- (void)setValue:(nullable id)value forKey:(NSString *)key;          //通过Key来设值
- (nullable id)valueForKeyPath:(NSString *)keyPath;                  //通过KeyPath来取值
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;  //通过KeyPath来设值

作者:黑暗中的孤影
链接:https://www.jianshu.com/p/45cbd324ea65

valueForKey:的原理

查找key获取value值的流程图
1-顺序查找getKey/key/isKey/_key这4个方法,找到就调用返回value值
2-没找到,就调用accessInstanceVariablesDirectly,是否允许直接访问对象变量
3-假如accessInstanceVariablesDirectlyYes,就顺序查找成员变量_key,_isKey,key,isKey,找到就返回value值,否则就调用valueForUndefinedKey:并抛出异常.
4-假如accessInstanceVariablesDirectlyNO,调用valueForUndefinedKey:并抛出异常.

valueForKey:原理图

setValue:forKey:的原理

根据key设置value值的流程图
1-顺序查找setKey:,_setKey:这2个方法,找到就调用设置value值
2-没找到,就调用accessInstanceVariablesDirectly,是否允许直接访问对象变量
3-假如accessInstanceVariablesDirectlyYes,就顺序查找成员变量_key,_isKey,key,isKey,找到就直接赋值value值,否则就调用setValue:forUndefinedKey:并抛出异常.
4-假如accessInstanceVariablesDirectlyNO,调用setValue:forUndefinedKey:并抛出异常.

屏幕快照 2018-08-07 11.29.25.png

KVO

key value observing (键值监听 /观察者模式)/是一种回调机制
在某个对象注册监听者后/在被监听的对象发生改变时/对象会发送一个通知给监听者/以便监听者执行回调
就是每次指定的被观察的对象的属性被修改后 /KVO就会自动通知响应的观察者

KVO和KVC一样都依赖于Runtime的动态及时 /都属于键值编程而且底层实现机制都是isa-swizzling

系统利用Runtime主动生成一个子类对象,NSKVONotifying_xxx类,改写属性set方法大概如下所示:
willChangeValueForKey:即将改变值
super setXXX:父类设置值
didChangeValueForKey:同时通知监听器对象属性改变了

屏幕快照 2018-08-07 12.12.17.png
屏幕快照 2018-08-07 12.08.15.png

iOS开发技巧系列---详解KVC(我告诉你KVC的一切)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容