KVC学习

作者: 朝夕向背 | 来源:发表于2018-11-08 19:12 被阅读0次

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方法。

相关文章

  • iOS基础(四) - KVC和KVO

    iOS观察者模式学习 (1)KVC与KVO简介 KVC KVC(Key-value coding)是一种间接更改对...

  • KVC学习

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

  • 学习kvc

    KVC官方介绍:查看文档 成员变量、实例变量及属性的区别 如图一,大括号里边的都是成员变量,而实例变量是特殊的成员...

  • KVC学习

    Key-Value Coding 常见方法 key 和 keyPath 的区别 key 只能访问对象的属性key...

  • KVC、KVO的本质

    这篇文章介绍KVC、KVO的本质。如果你对KVC、KVO不了解,推荐先查看其用法:KVC和KVO学习笔记[http...

  • KVC/KVO小结

    KVC和KVO的学习 KVC介绍KVC的本质就是键值编码定义:在对象创建完成之后,动态(牵扯到运行时)给对象的属性...

  • iOS KVC

    OC底层学习笔记(4)-KVC - 简书

  • iOS-KVC相关

    KVC相关 一、 iOS成员变量,实例变量,属性变量的区别 二、KVC取值、赋值原理 *学习方式:1、分析源码 -...

  • KVC详解

    KVC 目录结构KVC定义KVC取值和设置KVC使用keyPathKVC处理字典KVC作用 参考:iOS KVC和...

  • iOS原理篇(二): KVC实现原理

    KVC实现原理 什么是 KVC KVC基本使用 KVC 原理 总结 一 、 什么是KVC KVC的全称是Key-V...

网友评论

      本文标题:KVC学习

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