前言
上篇文章大致阐述了KVC在key
正确情况下的执行过程,这篇来说说key
错误时KVC是如何运行的。
正文
如果传入一个错误的key
会怎样?
可以看到,程序在2次尝试匹配新的key
无果后,抛出异常[<JKTest 0x7f9801519f50> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key jack.
回到NSKeyValueCoding.h
可以找到这个方法,与之对应的还有另一个方法
- (void)setValue:(id)value forUndefinedKey:(NSString *)key;
- (id)valueForUndefinedKey:(NSString *)key;
上述方法见名知意,显然可以在这里做点手脚
重定向这样KVC又可以正常工作了。来看一下执行过程,由于没有key
,每次赋值\取值都会2次重新匹配key
,发现匹配不到正确的key
后执行上述两个方法。可以看到,这个过程不会执行object
的getter
和setter
(倒数第二的getter
是NSLog(@"%@", test.object);
执行的,用来查看是否赋值成功)。
结合上篇文章,此时如果实现jack
的setter
和getter
会怎样?
没错,直接找到key
对应的getter
和setter
,不会去匹配新key
,更不用执行上述的两个重定向方法
KVV
KVV(key value validate),KVC中还提供键值验证,即KVV
- (BOOL)validateValue:(inout id *)ioValue forKey:(NSString *)inKey error:(out NSError **)outError;
这个方法系统不会主动调用,并且默认实现为- (BOOL)validate<Key>:error:
,口说无凭,上代码
除此之外,KVC中还有一个方法可以处理错误
- (void)setNilValueForKey:(NSString *)key;
他在KVC赋值时,key
为NSNumber
(基本数据类型会自动转为NSNumber)或NSValue
(结构体需手动转成NSValue
)时调用,再举个例子
另外,也可在各种数据转模型框架中看到KVC中将基本数据类型自动转为NSNumber
的影子,如MJExtension
网友评论