iOS --- KVO
KVO 的底层实现原理
(1)KVO 是基于 runtime 机制实现的
(2)假如有个对象DoLin(类型为Dog), 其属性name发生变化时,系统会自动生成一个继承Dog的类,NSKVONotifying_类名,次例为NSKVONotifying_Dog, 在这个类的setName方法中调用3个方法:
[super setName:name];
[self willChangeValueForKey:@"name"];
[self didChangeValueForKey:@"name"];
后面两个方法内部会主动调用;
(3)方法回调
-(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void*)context;
根据此方法的返回做UI刷新等操作。
KVO的作用:
- (void)viewDidLoad {
[super viewDidLoad];
Dog*d1 = [[Dogalloc]init];
d1.name =@"DoLin";
[d1 addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:@"123"];//@"123"是随意写入的,如果很多不同的模型需要用到KVO, 可写入不同值用于区分,否则,写nil即可。
}
/**
* 利用KVO 监听到对象属性值改变后,就会调用这个方法
*
* @param keyPath 哪一个属性被改了
* @param object 哪一个对象的属性被改了
* @param change 改成什么样了
*/- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void*)context{
// NSKeyValueChangeNewKey == @"new"
NSString*new = change[NSKeyValueChangeNewKey];
// NSKeyValueChangeOldKey == @"old"
NSString*old = change[NSKeyValueChangeOldKey];NSLog(@"%@-%@",new,old);}