實現(xiàn)原理:
KVC的賦值本質(zhì)上只是調(diào)用了屬性的setter方法,setter方法會按照setKey藕畔、_setKey马僻、setIsKey的優(yōu)先級進行調(diào)用,還沒有注服,則按_key韭邓、_isKey、key溶弟、isKey查找成員變量仍秤。
如果accessInstanceVariablesDirectly返回NO,則不會查找_key可很、_isKey、key凰浮、isKey我抠,會直接調(diào)用- (void)setValue:(id)value forUndefinedKey:(NSString *)key。
若查找到isKey還是沒找到袜茧,也會調(diào)用(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梦湘;