KVC学习

KVC俗称键值编码,可以通过一个key值来访问对象的某个属性。
常见的KVC API
赋值

  • - (void)setValue:(id)value forKey:(NSString *)key
  • - (void)setValue:(id)value forKeyPath:(nonnull NSString *)keyPath
    取值
  • - (id)valueForKey:(NSString *)key
  • - (id)valueForKeyPath:(NSString *)keyPath

setValue:forKey:的原理

  • 1、根据传入的key值,按照顺序setKey:_setKey:的顺序查找setter方法,如果找到,调用这个方法并将值传进去;
  • 2、如果没有找到setter方法,则查看accessInstanceVariablesDirectly方法的实现,这个一个BOOL方法,如果这个类返回YES,则查找一个命名规则为_<key>、_is<key>、<key>、is<key>的成员变量,根据这个顺序,如果发现成员变量,则将value赋值给成员变量;
  • 3、如果没有发现setter或者其他实例变量,则调用setValue:forUndefinedKey:方法,并默认退出异常。

valueForKey的原理

  • 1、根据key值,按照顺序,查找getKeykeyisKey_key方法,如果找到了方法,调用方法取值;
  • 2、如果没有发现上述方法,则调用accessInstanceVariablesDirectly,如果此方法返回YES,则按照顺序查找_<key>_is<Key><key>is<Key>成员变量,如果找到,调用方法取值;
  • 3、如果所有情况都失败,则调用valueForUndefinedKey方法并抛出异常。
    注意valueForUndefinedKey可以在子类中重写。

setValue:forKey:和setObject:forKey:的区别

setObject:forKey:是Foundation中Dictionary这个类中定义的,而setValue:forKey:是KVC定义的方法。
setObject:forKey:中key和value值都不能为nil,但是可以使[NSNull null],而setValue:forKey:value值可以为nil,但是key值不能为nil。但是value值为nil时,会调用removeObject:forKey方法。
在调用setValue:forKey:时,会先调用setObject:forKey:。如果setValue:forKey:value值为nil,则会调用removeObject:forKey方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容