iOS KVC补充版

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", 即keyname时;

  1. 首先查找是否有相应的getter方法, 如果有,则直接执行;

查找getter方法的顺序 getName()>name()>isName()>_name(), 如果查到则直接调用, 基本数据类型封装成NSNumber;

  1. 查找方法accessInstanceVariablesDirectly返回值返回YES的话查找成员变量;
  2. 查找成员变量;

成员变量查找顺序: _name> _isName> name> isName;

  1. 如果均不能查找到则查找valueForUndefinedKey:方法,如果实现此方法则调用, 未实现则crash然后抛出NSUndefinedKeyException的未定义key异常;

总结取值流程为: getName()=>name()=>isName()=>_getName()=>_name()=>_name=>_isName=>name=>isName

KVC取值流程大致走向

3. KVC赋值的流程:

name为例当调用setValue:@"value" forKey:@"name", 即keyname时;

  1. 首先就是调用 setter 方法, 如果有,则直接执行;

查找方法的顺序 setName()>_setName, 如果查到则调用;

  1. 查找方法accessInstanceVariablesDirectly返回值返回YES的话查找成员变量;
  2. 查找成员变量;

成员变量查找顺序: _name> _isName> name> isName;

  1. 如果均不能查找到则查找setValue:forUndefinedKey::方法,如果实现此方法则调用, 未实现则crash然后抛出NSUndefinedKeyException的未定义key异常;

日常开发中使用KVC时一定写上方法setValue:forUndefinedKey:就是防止crash;

总结赋值流程为: setName()=>_setName()=>_name=>_isName=>name=>isName=>抛出异常

KVC赋值流程大致走向


参考资料
iOS KVC和KVO详解

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