阅读 442

iOS-KVC的使用和原理

简介

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

文章分类
iOS
文章标签