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
网友评论