KVC && KVO

一、什么是KVC?

KVC(Key-value coding)键值编码,它提供了一种通过key直接访问对象的属性或成员变量的方法,而不需要调用明确的存取方法。这样就可以在运行时动态地访问和修改对象的属性或成员变量,而不是在编译时确定。

KVC使用的基本方法:

 //默认返回YES,表示如果没有找到Set<Key>方法的话,
 //会按照_key,_iskey,key,iskey的顺序搜索成员,
 //设置成NO就不这样搜索
 + (BOOL)accessInstanceVariablesDirectly;
 
 //KVC提供属性值正确性验证的API,它可以用来检查set的值是否正确、
 //为不正确的值做一个替换值或者拒绝设置新值并返回错误原因。
 - (BOOL)validateValue:(inout id __nullable * __nonnull)ioValue forKey:(NSString *)inKey error:(out NSError **)outError;
 
 //这是集合操作的API,里面还有一系列这样的API,
 //如果属性是一个NSMutableArray,那么可以用这个方法来返回。
 - (NSMutableArray *)mutableArrayValueForKey:(NSString *)key;
 
 //如果Key不存在,且没有KVC无法搜索到任何和Key有关的字段或者属性,
 //则会调用这个方法,默认是抛出异常。
 - (nullable id)valueForUndefinedKey:(NSString *)key;
 
  //和上一个方法一样,但这个方法是设值。
 - (void)setValue:(nullable id)value forUndefinedKey:(NSString *)key;

 //如果你在SetValue方法时面给Value传nil,则会调用这个方法
 - (void)setNilValueForKey:(NSString *)key; //输入一组key,返回该组key对应的Value,再转成字典返回,用于将Model转到字典。 - (NSDictionary<NSString *, id> *)dictionaryWithValuesForKeys:(NSArray<NSString *> *)keys;

二、KVC设值

假设在一个Person类中,有一个成员变量 _professional 表示职业,正常情况下,在外界是无法设置或获取其值的。那么用KVC是如何实现的呢?KVC要设值,是根据对象中的对应的 key 来决定的。KVC在内部又是按什么样的顺序来寻找 key 的呢?

当调用 setValue:@" " forKey:@" " 方法时,底层的执行机制如下:

1、首先搜索是否有 setKey:的方法(<Key>是成员变量名), 如果没有则会继续搜索是否有setIsKey:的方法;

2、如果上述方法仍没有找到,此时会调用 + (BOOL)accessInstanceVariablesDirectly 方法(是否直接访问成员变量方法),该方法默认返回YES,会按照_key,_iskey,key,iskey的顺序搜索成员名。若返回NO,则直接调用- (void)setValue:(id)value forUndefinedKey:(NSString *)key 方法(默认是抛出异常)。

猜你喜欢

转载自www.cnblogs.com/whongs/p/9859215.html