OC-KVC

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

使用

常用API

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

keyPath比key增加了路径访问;例:person.age

原理

setValue:forKey:原理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
graph LR
id1[setValue:forKey:]
id2{按照</br>setKey:&nbsp_setKey:</br>顺序查找方法}
id3[传递参数'调用方法]
id4{查看</br>accessInstanceVariablesDirectly</br>类方法的返回值}
id5{按照</br>_key&nbsp_isKey&nbspkey&nbspisKey</br>查找}
id6[直接赋值]
id7[调用:</br>setValue:forUndefinedKey:</br>并抛出异常NSUnknownKeyException]

id1 --> id2
id2 --找到了方法--> id3
id2 --没找到方法--> id4
id4 --YES--> id5
id5 --找到了成员变量--> id6
id5 --没找到成员变量--> id7
id4 --NO--> id7

accessInstanceVariablesDirectly方法的默认返回值是YES

valueForKey:的原理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
graph LR
id1[valueForKey:]
id2{按照</br>getKey&nbspkey&nbspisKey&nbsp_key</br>顺序查找方法}
id3[调用方法]
id4{查看</br>accessInstanceVariablesDirectly</br>类方法的返回值}
id5{按照</br>_key&nbsp_isKey&nbspkey&nbspisKey</br>查找}
id6[直接取值]
id7[调用:</br>valueForUndefinedKey:</br>并抛出异常NSUnknownKeyException]

id1 --> id2
id2 --找到了方法--> id3
id2 --没找到方法--> id4
id4 --YES--> id5
id5 --找到了成员变量--> id6
id5 --没找到成员变量--> id7
id4 --NO--> id7