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。markdown
// 赋值
[person1 setValue:@"jack" forKey:@"name"];
// 取值
NSString *name = [person1 valueForKey:@"name"];
复制代码
使用2: forKeyPath
是对更“深层”的对象进行访问。如数组的某个元素,对象的某个属性。如:spa
[myModel setValue:@"beijing" forKeyPath:@"address.city"];
// 返回全部对象的name属性值
NSArray *names = [array valueForKeyPath:@"name"];
复制代码
KVC和KVO都属于键值编程,并且底层实现机制都是isa-swizzingcode
1.按setKey:、_setKey:
的顺序查找方法,找到了就传递参数,调用方法。 2.若是没找到,查看accessInstanceVariablesDirectly
方法的返回值,返回 NO
则调用setValue:forUndefinedKey:
并抛出异常 NSUnknownKeyException
。orm
方法
accessInstanceVariablesDirectly
默认返回的是YES
对象
3.若是返回 YES
按照_key、_isKey、key、isKey
的顺序查找成员变量,找到了就直接赋值。 4.若是没找到,就调用setValue:forUndefinedKey:
并抛出异常NSUnknownKeyException
。ci
1.按照getKey、key、isKey、_key
的顺序查找方法,找到了就直接调用。 2.若是没找到,就查看accessInstanceVariablesDirectly
方法的返回值,返回 NO
则 调用valueForUndefinedKey:
并抛出异常NSUnknownKeyException
。 3.若是返回 YES
按照_key、_isKey、key、isKey
的顺序查找成员变量。找到了就直接取值。 4.若是 没有查找到,就调用valueForUndefinedKey:
并抛出异常NSUnknownKeyException
。get