4.1 KVC/KVO —— KVC简单介绍

2020-05-13  本文已影响0人  哈库呐玛塔塔__

KVC是一种可以通过字符串的名字(key)来访问类属性的机制。而不是单单通过调用Setter、Getter方法访问。

KVC的定义全部都是通过对NSObject的一个叫做NSKeyValueCoding的类别的扩展来实现的,所以对于所有继承于NSObject的类都可以使用KVC。(基本数据类型或者结构体,需要通过转换成NSNumber和NSValue)

最重要的四个方法:

valueForKey、valueForKeyPath; setValue ForKey、setValue ForKeyPath。

NSKeyValueCoding类别中其他的一些方法:

+ (BOOL)accessInstanceVariablesDirectly; 

//默认返回YES,表示如果没有找到set<Key>/get<Key>方法的话,会按照_key,_iskey,key,iskey的顺序搜索成员,设置成NO就不这样搜索 ,只会判断是否找到了set<Key>/get<Key>方法,如果没有找到则会调用setValue:forUndefinedKey:或者valueForUndefinedKey:方法

- (BOOL)validateValue:(inout id __nullable * __nonnull)ioValue forKey:(NSString *)inKey error:(out NSError **)outError;

 //KVC提供属性值正确性验证的API,它可以用来检查set的值是否正确、为不正确的值做一个替换值或者拒绝设置新值并返回错误原因。需要手动调用。

- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key; 

//这是集合操作的API,里面还有一系列这样的API,如果属性是一个NSMutableArray,那么可以用这个方法来返回。 

数组属性直接调用addObject方法并不能调用KVO的监听方法,但是mutableArrayValueForKey:方法获取的array,调用addObject方法是可以调用到KVO的监听方法的

- (nullable id)valueForUndefinedKey:(NSString *)key;

 //如果Key或者keyPath不存在,且没有KVC无法搜索到任何和Key有关的字段或者属性,则会调用这个方法,默认是抛出异常。通常我们通过重写这个方法(一般是NSLog(key)),来避免程序崩溃。

(按照set<Key>/get<Key>  、  _key 、 _isKey 、  key 、 isKey都无法搜索到)

- (void)setValue:(nullable id)value forUndefinedKey:(NSString *)key; 

//和上一个方法一样,但这个方法是设值。

- (void)setNilValueForKey:(NSString *)key; 

//当通过KVC给某个非对象的属性赋值为nil时,则会调用这个方法。值类型是不能为nil的

- (NSDictionary<NSString *, id> *)dictionaryWithValuesForKeys:(NSArray<NSString *> *)keys; 

//输入一组key,返回该组key对应的Value,再转成字典返回,用于将Model转到字典。

参考文章:

https://blog.csdn.net/changcongcong_ios/article/details/76658854

https://www.jianshu.com/p/b9f020a8b4c9

https://www.jianshu.com/p/1d39bc610a5b

https://www.jianshu.com/p/45cbd324ea65

上一篇下一篇

猜你喜欢

热点阅读