实现原理:
KVC的赋值本质上只是调用了属性的setter方法,setter方法会按照setKey、_setKey、setIsKey的优先级进行调用,还没有,则按_key、_isKey、key、isKey查找成员变量。
如果accessInstanceVariablesDirectly返回NO,则不会查找_key、_isKey、key、isKey,会直接调用- (void)setValue:(id)value forUndefinedKey:(NSString *)key。
若查找到isKey还是没找到,也会调用(void)setValue:(id)value forUndefinedKey:(NSString *)key,该方法默认会抛出异常。
crash的场景:
key 不是对象的属性,造成崩溃。
keyPath 不正确,造成崩溃。
key 为 nil,造成崩溃。
value 为 nil,为非对象设值,造成崩溃: [objc setValue:nil forKey:@"age"];
crash的防护:
load方法中对setValue: forUndefinedKey:和valueForUndefinedKey方法做方法替换,判断key或value为nil时return;