美文网首页
iOS底层原理分析之KVC

iOS底层原理分析之KVC

作者: 程序员学哥 | 来源:发表于2019-11-03 19:30 被阅读0次

惯例来一个官方解释: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.png
valueForKey:的原理
valueForKey.png
+ (BOOL)accessInstanceVariablesDirectly{
      return YES; 
}

accessInstanceVariablesDirectly的意思表示是否可以直接访问成员变量,如果返回值是NO 不可以直接给成员变量负值,如果强制负值的话就会报NSUnkonwKeyException错误。如果返回值是YES,会按照 _key、_isKey、key、iskey的顺序进行负值。同样如果这些还是找不到同样会报NSUnkonwKeyException的错误 。

最后附上一道面试题:
通过KVC修改属性会触发KVO么?会触发KVO因为会走属性的set方法。


KVC修改属性.png

相关文章

网友评论

      本文标题:iOS底层原理分析之KVC

      本文链接:https://www.haomeiwen.com/subject/afdlbctx.html