oc 基础 - KVC

126 阅读1分钟
  1. 通过KVC 修改属性会出发KVO 吗 ?

会的 , 不管对象有没有实现set方法都可以

{ kvc 内部类似这种实现 [self will change value]; [self.person-age = 10]; [did change value]; }

  1. KVC 的赋值过程是怎样的? 原理是什么 ?

======

KVC Key-value Coding 键值编码 通过key 来访问某个属性

常见的API 有 //设置属性值

  • (void)setValue Forkeypath
  • (void)setValue forKey //获取属性值
  • (void)valueForKeyPath
  • (void)valueForKey

peron.age = 10;

kvc

[person setValue:@10 forKey:@"age"];

[person setValue:@10 forKeyPath:@"cat.weight"];

int a = [person valueForKey:@"age"];

setvalue

按顺序寻找 setKey _setKey 方法 如果找到 就传递参数调用方法

如果没有 就会查找 // 能否直接访问成员变量

  • (Bool)accessInstanceVariablesDirectly {

    return YES; 默认返回yes

    按这个顺序 查找 _key _isKey key iskey 如果有 就设置 没有就保存

    return NO; 奔溃 找不到key }

valueForKey : 的原理

先按 get 方法查抄 get方法的顺序 getKey key isKey _key

找到任意一个即可调用

如果都不存在

// 能否直接访问成员变量

  • (Bool)accessInstanceVariablesDirectly {

    return YES; 默认返回yes

    按这个顺序 查找 _key _isKey key iskey 如果有 就设置 没有就保存

    return NO; 奔溃 找不到key }