1-->定义
KVO : (Key - Value - Observer) 键值观察者,是观察者设计模式的一种具体实现(C层和M层的通信)
KVO触发机制:一个对象(观察者),检测另一个对象(被观察者)的某属性是否发生变化,若被监测的属性发生了更改,会触发观察者的一个方法(方法名固定,类似代理方法)
2-->使用步骤:
注册观察者(为被观察这指定观察者以及被观察者属性)
实现回调方法
触发回调方法
移除观察者
3-->一般KVO奔溃的原因:
被观察的对象销毁掉了(被观察的对象是一个局部变量)
观察者被释放掉了,但是没有移除监听(如模态推出,push,pop等)
注册的监听没有移除掉,又重新注册了一遍监听
4-->例子
对自定义类属性观察
*/
// 1.实例化对像
self.person = [[WMPerson alloc] initWithName:@"Kermit"];
// 2.注册观察者 @“name”为person对像的属性名称
[self.person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
// 3.实现回调
//keyPath:属性名称
//object:被观察的对象
//change:变化前后的值都存储在change字典中
//context:注册观察者的时候,context传递过来的值
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change: (NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
NSString *oldName = [change objectForKey:NSKeyValueChangeOldKey];
NSString *newName = [change objectForKey:NSKeyValueChangeNewKey];
NSLog(@"属性旧值:%@---属性新值:%@",oldName,newName);
self.logLabel.text = [NSString stringWithFormat:@"属性旧值:%@---属性新值:%@",oldName,newName];
}
注意:对属性值赋值需要通过setter方法,否则触发不了回调。在不使用时需要把观察者移除