1. 什么是KVC
KVC
全称Key-Value coding
;是APPLE
给我们提供的一种键值编码机制;
相关的方法:
///直接通过Key来取值
- (nullable id)valueForKey:(NSString *)key;
///通过Key来设值
- (void)setValue:(nullable id)value forKey:(NSString *)key;
///通过KeyPath来取值
- (nullable id)valueForKeyPath:(NSString *)keyPath;
///通过KeyPath来设值
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
2. KVC
取值的流程:
当调用valueForKey:@"name"
, 即key
为name
时;
- 首先查找是否有相应的
getter
方法, 如果有,则直接执行;
查找
getter
方法的顺序getName()
>name()
>isName()
>_name()
, 如果查到则直接调用, 基本数据类型封装成NSNumber
;
- 查找方法
accessInstanceVariablesDirectly
返回值返回YES
的话查找成员变量; - 查找成员变量;
成员变量查找顺序:
_name
>_isName
>name
>isName
;
- 如果均不能查找到则查找
valueForUndefinedKey:
方法,如果实现此方法则调用, 未实现则crash
然后抛出NSUndefinedKeyException
的未定义key
异常;
总结取值流程为: getName()
=>name()
=>isName()
=>_getName()
=>_name()
=>_name
=>_isName
=>name
=>isName
KVC取值流程大致走向
3. KVC
赋值的流程:
以name
为例当调用setValue:@"value" forKey:@"name"
, 即key
为name
时;
- 首先就是调用
setter
方法, 如果有,则直接执行;
查找方法的顺序
setName()
>_setName
, 如果查到则调用;
- 查找方法
accessInstanceVariablesDirectly
返回值返回YES
的话查找成员变量; - 查找成员变量;
成员变量查找顺序:
_name
>_isName
>name
>isName
;
- 如果均不能查找到则查找
setValue:forUndefinedKey::
方法,如果实现此方法则调用, 未实现则crash
然后抛出NSUndefinedKeyException
的未定义key
异常;
日常开发中使用
KVC
时一定写上方法setValue:forUndefinedKey:
就是防止crash
;
总结赋值流程为: setName()
=>_setName()
=>_name
=>_isName
=>name
=>isName
=>抛出异常
KVC赋值流程大致走向
参考资料
iOS KVC和KVO详解