iOS KVC
2019-04-11 本文已影响15人
飞不越疯人院
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
, 如果查到则直接调用, 基本数据类型封装成NSNumber
;
- 如果没有相应的
getter
方法, 则查找是否有相应(同名或相似)的实例变量;
同名或者类似的成员变量,名字均可
_name
,_isName
,name
,isName
;
注意:+ (BOOL)accessInstanceVariablesDirectly
;这个方法, 此方法默认返回YES
(允许查找同名成员变量); 如果设置为NO
(即使有同名成员变量也不能获取到相应的值)
- 如果均不能查找到则调用
valueForUndefinedKey:
方法, 然后抛出NSUndefinedKeyException
的未定义key
异常;
3. KVC
赋值的流程:
当调用setValue:@"value" forKey:@"name"
, 即key
为name
时;
- 查找是否有相关的
setter
方法, 如果有, 则直接执行; - 如果没有相应的
setter
方法, 则查找是否有相应(同名或相似)的实例变量;
同名或者类似的成员变量,名字均可
_name
,_isName
,name
,isName
;
注意:+ (BOOL)accessInstanceVariablesDirectly
;这个方法, 此方法默认返回YES
(允许查找同名成员变量); 如果设置为NO
(即使有同名成员变量也不能进行赋值)
- 如果均不能查找到则调用
setValue:forUndefinedKey:
方法, 然后抛出NSUndefinedKeyException
的未定义key
异常;
参考资料
iOS KVC和KVO详解