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:并抛出异常.

iOS底层原理 - 《KVO与KVC探索》_第1张图片
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:并抛出异常.

iOS底层原理 - 《KVO与KVC探索》_第2张图片
屏幕快照 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:同时通知监听器对象属性改变了

iOS底层原理 - 《KVO与KVC探索》_第3张图片
屏幕快照 2018-08-07 12.12.17.png
iOS底层原理 - 《KVO与KVC探索》_第4张图片
屏幕快照 2018-08-07 12.08.15.png

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

你可能感兴趣的:(iOS底层原理 - 《KVO与KVC探索》)