KVC
可以通过Key
直接访问对象的属性,或者给对象的属性赋值。而不需要调用明确的存取方法。这样就可以在运行时动态地访问和修改对象的属性、而不是在编译时确定。KVO
则是对目标对象的某属性添加观察,当该属性发生变化时,通过触发观察者对象实现的KVO接口方法,来自动的通知观察者。
KVC
- 全称:
Key Value Coding
(键值编码) - 本质 :
- 通过set方法修改成员变量属性的值(和调用set方法修改值是一样的)
- 而且可以修改私有成员变量的值(包括系统的私有成员变量)
- 而且会自动转换类型(只用于简单的转换)
- 赋值
1 | // 能修改私有成员变量 |
- 取值
1 | // 能取得私有成员变量的值 |
私有属性赋值
- 利用KVC给UIPageControl设置页码图片
1 | [pageControl setValue:[UIImage imageNamed:@"current"] forKeyPath:@"_currentPageImage"]; |
比较实用的方法
1 | XSBook *book1 = [[XSBook alloc] init]; |
不常用的方法
1 | // 计算数量 |
KVO
- 全称:
Key Value Observing
(键值监听) - 作用:监听模型的属性值改变
步骤
添加监听器
1
2
3
4
5// 为对象p添加一个观察者(监听器)
// Observer:观察者(监听器)
// KeyPath:属性名(需要监听哪个属性)
// 利用b对象来监听a对象name属性的改变
[a addObserver:b forKeyPath:@"name" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:@"test"];
在监听器中实现监听方法
1
2
3
4
5
6
7
8
9
10
11
12/**
* 当利用KVO监听到某个对象的属性值发生了改变,就会自动调用这个
*
* @param keyPath 哪个属性被改了
* @param object 哪个对象的属性被改了
* @param change 改成咋样
* @param context 当初addObserver时的context参数值
*/
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"%@ %@ %@ %@", object, keyPath, change, context);
}