iOS KVC

作者: 飞不越疯人院 | 来源:发表于2019-04-11 20:48 被阅读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", 即keyname时;

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

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

  1. 如果没有相应的getter方法, 则查找是否有相应(同名或相似)的实例变量;

同名或者类似的成员变量,名字均可_name, _isName, name, isName;
注意:+ (BOOL)accessInstanceVariablesDirectly;这个方法, 此方法默认返回YES(允许查找同名成员变量); 如果设置为NO(即使有同名成员变量也不能获取到相应的值)

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

3. KVC赋值的流程:

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

  1. 查找是否有相关的setter方法, 如果有, 则直接执行;
  2. 如果没有相应的setter方法, 则查找是否有相应(同名或相似)的实例变量;

同名或者类似的成员变量,名字均可_name, _isName, name, isName;
注意:+ (BOOL)accessInstanceVariablesDirectly;这个方法, 此方法默认返回YES(允许查找同名成员变量); 如果设置为NO(即使有同名成员变量也不能进行赋值)

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

参考资料
iOS KVC和KVO详解

相关文章

网友评论

    本文标题:iOS KVC

    本文链接:https://www.haomeiwen.com/subject/qnzxwqtx.html