惯例来一个官方解释:KVC的全称是Key-Value Coding,俗称“键值编码”,可以通过一个key来访问某个属性。
常见用的API有
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
- (void)setValue:(id)value forKey:(NSString *)key;
- (id)valueForKeyPath:(NSString *)keyPath;
- (id)valueForKey:(NSString *)key;
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath 和 - (void)setValue:(id)value forKey:(NSString *)key 的区别:
keyPath :表示属性路径,负值的时候是根据路径去寻找到对应的属性,一层一层往下找。(可以理解成一个复合路径,比如Person有一个age属性,那么_person.age就是一个复合属性,会先去找到person这个对象,再去找到age这个属性进行负值)
forKey :是直接通过设置的属性名进行负值的,如果按路径找会报错。(可以理解成一个简单路径)
同理- (id)valueForKeyPath:(NSString *)keyPath 与 - (id)valueForKey:(NSString *)key的区别。
下面通过流程图的方式进行分析,方便理解
setValue:forKey:的原理
setValue:forKey.pngvalueForKey:的原理
valueForKey.png+ (BOOL)accessInstanceVariablesDirectly{
return YES;
}
accessInstanceVariablesDirectly的意思表示是否可以直接访问成员变量,如果返回值是NO 不可以直接给成员变量负值,如果强制负值的话就会报NSUnkonwKeyException错误。如果返回值是YES,会按照 _key、_isKey、key、iskey的顺序进行负值。同样如果这些还是找不到同样会报NSUnkonwKeyException的错误 。
最后附上一道面试题:
通过KVC修改属性会触发KVO么?会触发KVO因为会走属性的set方法。
KVC修改属性.png
网友评论