@chenbinghua
2015-09-12T10:33:49.000000Z
字数 938
阅读 1574
iOS笔记
全名为:Key Value Observing,直译为:基于键值的观察者
大概就是一个对象可以监听
另一个对象的成员变量的变化
。
KVO的三个步骤
A监听B的name属性的改变
// B添加监听者
[B addObserver:A forKeyPath:@"name" options: NSKeyValueObservingOptionOld context:nil];
// A实现监听方法
/**
* 当监听到object的keyPath属性发生了改变
*/
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"监听到%@对象的%@属性发生了改变, %@", object, keyPath, change);
}
// 当A销毁时移除监听
- (void)dealloc
{
[B removeObserver:self forKeyPath:@"name"];
}
addObserver:forKeyPath:options:context:各个参数的作用分别是什么,observer中需要实现哪个方法才能获得KVO回调?
/*
1 观察者,负责处理监听事件的对象
2 观察的属性
3 观察的选项,可以监听新值或旧值
4 上下文
*/
addObserver:forKeyPath:options:context:
// 所有的 kvo 监听到事件,都会调用此方法
/*
1. 观察的属性
2. 观察的对象
3. change 属性变化字典(新/旧)
4. 上下文,与监听的时候传递的一致
*/
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;
参考博客如何自己动手实现KVO
KVO 的实现也依赖于 Objective-C 强大的 Runtime
KVO的底层实现绝对是个黑魔法