简介
KVC(Key Value Coding)
是一种可以通过key来访问类属性的机制。而不是通过调用Setter、Getter
方法访问。可以在运行时动态访问和修改对象的属性。
KVC的方法定义在Foundation/NSKeyValueCoding
中。
提供了常用的方法:
-(void)setValue:(id)value forKeyPath:(NSString *)keyPath;
-(void)setValue:(id)value forKey:(NSString *)key;
-(id)valueForKeyPath:(NSString *)keyPath;
-(id)valueForKey:(NSString *)key;
复制代码
使用1: 假如name是自定义Person类的一个属性,使用KVC。
// 赋值
[person1 setValue:@"jack" forKey:@"name"];
// 取值
NSString *name = [person1 valueForKey:@"name"];
复制代码
使用2:
forKeyPath
是对更“深层”的对象进行访问。如数组的某个元素,对象的某个属性。如:
[myModel setValue:@"beijing" forKeyPath:@"address.city"];
// 返回所有对象的name属性值
NSArray *names = [array valueForKeyPath:@"name"];
复制代码
KVC和KVO都属于键值编程,而且底层实现机制都是isa-swizzing
底层原理
- setValue:forKey:
1.按setKey:、_setKey:
的顺序查找方法,找到了就传递参数,调用方法。
2.如果没找到,查看accessInstanceVariablesDirectly
方法的返回值,返回 NO
则调用setValue:forUndefinedKey:
并抛出异常 NSUnknownKeyException
。
方法
accessInstanceVariablesDirectly
默认返回的是YES
3.如果返回 YES
按照_key、_isKey、key、isKey
的顺序查找成员变量,找到了就直接赋值。
4.如果没找到,就调用setValue:forUndefinedKey:
并抛出异常NSUnknownKeyException
。
- valueForKey:
1.按照getKey、key、isKey、_key
的顺序查找方法,找到了就直接调用。
2.如果没找到,就查看accessInstanceVariablesDirectly
方法的返回值,返回 NO
则 调用valueForUndefinedKey:
并抛出异常NSUnknownKeyException
。
3.如果返回 YES
按照_key、_isKey、key、isKey
的顺序查找成员变量。找到了就直接取值。
4.如果 没有查找到,就调用valueForUndefinedKey:
并抛出异常NSUnknownKeyException
。