美文网首页
KVC的本质

KVC的本质

作者: 南城同學 | 来源:发表于2019-08-08 19:16 被阅读0次
方法:

- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
- (void)setValue:(id)value forKey:(NSString *)key;
- (id)valueForKeyPath:(NSString *)keyPath;
- (id)valueForKey:(NSString *)key;

key和keyPath的区别:

-key只能放当前对象的属性,如:“age”
-keyPath可以路径,如:“student.age”


setValue:forKey: 赋值的原理
赋值查找.png
  • 第一步,按顺序查找setKey:_setKey:方法;
  • 都没找到,查看accessInstanceVariablesDirectly方法返回值是否为YES;
  • 如果是,则继续按顺序查找:_key_isKeykeyisKey;
  • 如果布尔值为NO,或者最后还是没查找到对应的方法,则抛出异常:setValue:forUndefinedKey:

value:forKey: 获取值的原理
取值查找.png
  • 第一步,按顺序查找getKey:key:isKey:_key:方法;
  • 都没找到,查看accessInstanceVariablesDirectly方法返回值是否为YES;
  • 如果是,则继续按顺序查找:_key_isKeykeyisKey;
  • 如果布尔值为NO,或者最后还是没查找到对应的方法,则抛出异常:valueForUndefinedKey:

扩展

1、通过KVC修改属性,会触发KVO吗?

  • 会。

原理:
[person setValue:@10 forKey:@"age"]的底层实现:

  • [person willChangeValueForKey:@"age"];
  • person->_age = 10;
  • [person didChangeValueForKey:@"age"];

didChangeValueForKey:内部会调用observer的observeValueForKeyPath:ofObject:change:context:方法,即:KVO。

相关文章

  • KVC本质

    在设置setValueForKey时,如果对象的属性添加了KVO观察,会调用KVO,即使设置的key没有通过set...

  • KVC本质

    1.赋值操作 2.取值操作 3.用赋值KVC操作是否会触发KVO

  • KVC本质

    KVC KVC的全称是Key-Value Coding,俗称“键值编码”,可以通过一个key来访问某个属性. KV...

  • KVC的本质

    方法: - (void)setValue:(id)value forKeyPath:(NSString *)key...

  • KVC的本质

    通过KVC修改属性会触发KVO么? 会触发通过-_isKVOA方法判定是否有监听器(_isKVOA为KVO生成的N...

  • KVC 的本质

    问?直接修改成员变量会触发KVO么?KVC的赋值和取值过程是怎样的?原理是什么? KVC的全称是Key-Value...

  • 处理Model (二) 使用KVC 方法及其本质

    .h文件 .m文件 KVC本质

  • swift kvc 构造函数

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

  • KVO和KVC的使用及原理解析

    一 KVO基本使用 二 KVO本质原理讲解及代码验证 三 KVC基本使用 四 KVC设值原理 五 KVC取值原理 ...

  • KVC、KVO的本质

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

网友评论

      本文标题:KVC的本质

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