前言
本文属笔记性质,是对kirito_song和冰凌天两位文章学习和转载
文章具体地址:
MJiOS底层笔记--KVO本质
小码哥iOS学习笔记第五天: KVC的本质(调用顺序)
KVC
KVC的全称是Key-Value-Coding,即键值编码,通过一个key来访问某个属性- 常见的API:
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
- (void)setValue:(id)value forKey:(NSString *)key;
- (id)valueForKeyPath:(NSString *)keyPath;
- (id)valueForKey:(NSString *)key;
KVC赋值过程

上图的流程的解释
使用KVC给一个对象赋值时, 会有以下方法和属性的调用顺序
-
查看setKey:方法是否存在, 如果存在直接调用, 如果不存在进入下一步
-
查看_setKey:方法是否存在, 如果存在直接调用, 如果不存在进入下一步
-
查看+ (BOOL)accessInstanceVariablesDirectly方法的返回值, 默认返回YES
- YES: 可以访问成员变量, 进入下一步
- NO: 不可以访问成员变量, 同时调用
- (void)setValue:(id)value forUndefinedKey:(NSString *)key方法, 如果方法不存在会抛出异常
-
调用成员变量:_key, _isKey, key, isKey
- 调用顺序, 从左到右, 只有发现存在成员变量, 就不会在调用后续变量
- 如果没有成员变量, 会调用
- (void)setValue:(id)value forUndefinedKey:(NSString *)key方法, 如果方法不存在会抛出异常
KVC取值过程

上图的流程的解释
使用KVC给一个取值时, 会有以下方法和属性的调用顺序
-
判断是否有这几个方法: getKey, key, isKey, _key
-
从左到右, 如果有方法, 直接调用, 取值结束
-
如果没有进入下一步,调用
+ (BOOL)accessInstanceVariablesDirectly查看是否可以访问成员变量. 默认YES- YES: 可以访问成员变量, 进入下一步
- NO: 不可以访问成员变量, 判断是否实现
- (id)valueForUndefinedKey:(NSString *)key方法, 实现时调用, 未实现报错
-
判断是否有这几个成员变量: _key, _isKey, key, isKey
- 从左到右, 如果有成员变量, 直接访问, 取值结束
- 如果没有这几个成员变量, 直接进入下一步
- 如果没有成员变量, 会调用
- (id)valueForUndefinedKey:(NSString *)key方法, 如果方法不存在会抛出异常