OC语法(KVC)

作者: iLeooooo | 来源:发表于2019-01-29 15:09 被阅读51次

KVC的全称是Key-Value Coding,即"键值编码",可以通过一个key来访问某个属性。

常用的Api有:

// 通过key来设置instance对象的属性的值
- (void)setValue:(id)value forKey:(NSString *)key;
// 通过keyPath来设置instance对象的属性的值的值(有个对象cat是instance对象的属性,该对象有个属性high),keyPath为@"cat.high"
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
- (void)setValue:(id)value forUndefinedKey:(nonnull NSString *)key;
// 通过key来获得instance对象的属性的值
- (id)valueForKey:(NSString *)key;
// 同理keyPath
- (id)valueForKeyPath:(NSString *)keyPath;
- (id)valueForUndefinedKey:(NSString *)key;

G、题:通过KVC修改属性会触发KVO吗?

答:会触发KVO的。虽然说如果没有写属性,使用代码直接给成员变量赋值是不会触发KVO的,但是,如果使用KVC修改成员变量的值,是会触发KVO的。这是KVC的内部机制所导致的(KVC内部调用了手动触发KVC的机制即willChangeValueForKeydidChangeValueForKey)。在didChangeValueForKey的里面触发KVO监听。


H、题:KVC赋值和取值过程是怎样的?原理是什么?

答:

setValue:forKey:的赋值原理:
  1. 按照setKey:_setKey的顺序查找方法;
  2. 如果找到方法,则传递参数,调用方法;
  3. 如果没找到方法,则查看accessInstanceVariablesDirectly方法的返回值;
  4. 如果返回值为NO,则会调用setValue:forUndefinedKey:方法,并抛出异常,NSUnknownKeyException
  5. 如果返回值为YES,则按照_key -> _isKey -> key -> isKey 的顺序查找成员变量;
  6. 如果查找到了上述4个中的一个,直接赋值;
  7. 如果都没找到,则会调用setValue:forUndefinedKey:方法,并抛出异常,NSUnknownKeyException

注意:accessInstanceVariablesDirectly这个方法的默认返回值为YES

valueForKey:的取值原理:
  1. 按照getKey:keyisKey_key的顺序查找方法;
  2. 如果找到方法,则直接调用方法;
  3. 如果没找到方法,则查看accessInstanceVariablesDirectly方法的返回值;
  4. 如果返回值为NO,则会调用valueForUndefinedKey:方法,并抛出异常,NSUnknownKeyException
  5. 如果返回值为YES,则按照_key -> _isKey -> key -> isKey 的顺序查找成员变量;
  6. 如果查找到了上述4个中的一个,直接取值;
  7. 如果都没找到,则会调用valueForUndefinedKey:方法,并抛出异常,NSUnknownKeyException

相关文章

  • OC语法 KVC

    Key-Value-Coding 键值编码 可以通过一个Key来访问摸个属性。 常见的API: setValue:...

  • OC语法(KVC)

    KVC的全称是Key-Value Coding,即"键值编码",可以通过一个key来访问某个属性。 常用的Api有...

  • OC语法:KVC的底层实现

    一、KVC是什么二、怎么使用KVC三、KVC的底层实现四、KVC常见面试题 一、KVC是什么 KVC全称Key-V...

  • KVC

    今天和大家讨论一下OC中KVC(KeyValueCoding)键值编码 KVC定义 KVC(KeyValueCod...

  • KVC&KVO

    KVC Key value coding 键值对编程OC中KVC相关方法都放在NSKeyValueCoding类别...

  • iOS KVC

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

  • swift kvc 构造函数

    kvc 是oc特有 ,KVC 本质上是在运行时,直接调用程序会崩溃 介绍 kvc 构造函数 kvc构造函数的作用是...

  • (一)OC语法02(KVO与KVC)

    1、KVO KVO的作用是监听对象的属性的改变。重点之一就是必须是触发了属性的setter方法才会触发KVO,只是...

  • KVO&KVC

    KVC KVC: key value coding 键值编码 通过KVC语法,可以修改对象中的属性。设置值时:例...

  • Swift 基础之KVC 字典转模型构造函数

    KVC 字典转模型构造函数 以上代码编译就会报错! 原因:KVC 是 OC 特有的,KVC 本质上是在运行时,动态...

网友评论

    本文标题:OC语法(KVC)

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