KVC的全称是Key-Value Coding,俗称“键值编码”,可以通过一个key来访问某个属性。
常用的KVC方法
- set:
- setValue:( id)value forKey:(NSString *)key;
- setValue:( id)value forKeyPath:(NSString *)key;
- get:
- valueForKey:(NSString *)key;
- valueForKeyPath:(NSString *)key;
setValue:forKey:的原理
调用原理调用 setValue:forKey: 方法:
- 首先查找方法,按顺序查找 setKey:、_setKey: ,如果找到就传递参数,调用方法,完成kvc操作;
- 如果找不到方法,查看 accessInstanceVariablesDirectly 方法(默认返回值为YES)是否返回值为YES;如果是YES,说明可以查找成员变量,按顺序查找成员变量 _key、_isKey、key、isKey,如果找到直接赋值;
- 否则都将会调用 setValue: forUndefinedKey:,并抛出 NSUnknownKeyException 异常;
valueForKey: 的原理
调用原理调用 valueForKey: 方法:
- 首先查找方法,按照顺序查找 getKey、key、isKey、_key,如果找到直接返回结果;
- 如果找不到方法,查看 accessInstanceVariablesDirectly 方法(默认返回值为YES)是否返回值为YES;如果是YES,说明可以查找成员变量,按顺序查找成员变量 _key、_isKey、key、isKey,如果找到直接赋值;如果找到就取值;这个步骤和setValue:forKey: 相似;
- 否则都将会调用 valueForUndefinedKey: ,并抛出 NSUnknownKeyException 异常;
应用
kvc赋值,可以响应kvo回调
// 添加KVO监听
[person addObserver:observer forKeyPath:@"age" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL];
// 通过KVC修改age属性
[person setValue:@10 forKey:@"age"];
// 移除KVO监听
[person removeObserver:observer forKeyPath:@"age"];
或
// 添加KVO监听
[person addObserver:observer forKeyPath:@"age" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL];
// 通过KVC修改age属性
// 添加KVO监听
[person addObserver:observer forKeyPath:@"age" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL];
// 通过KVC修改age属性
[person willChangeValueForKey:@"age"];
person->_age = 10;
[person didChangeValueForKey:@"age"];
// 移除KVO监听
[person removeObserver:observer forKeyPath:@"age"];
打印:
observeValueForKeyPath - {
kind = 1;
new = 10;
old = 0;
}
网友评论