KVO(键值监听),即 Key-Value Observing, 是Objective-C 对观察者设计模式的一种实现。它提供一种机制,当指定的对象的属性被修改后(执行了setter 或 KVC 赋值),对象就会接受到通知。html
当某个对象的某个属性值改变时,用KVO监听。设计模式
一、模型建立 在.h中数组
@interface PDcar : NSObject
@property (nonatomic,assign) int num; // 属性
@end
复制代码
二、在 VC 中监听并响应属性改变markdown
@interface ViewController ()
@property (nonatomic,strong)PDcar *myCar; //声明了car属性
@end
复制代码
- (void)viewDidLoad {
[super viewDidLoad];
self.myCar = [[PDcar alloc] init];
//设置监听
[self.myCar addObserver:self forKeyPath:@"num" options:
NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];
}
复制代码
三、实现监听回调方法oop
// 只要object的keyPath属性发生变化,就会调用此方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary<NSString *,id> *)change context:(void *)context{
// 判断是否为self.myCar的属性“num”:
if([keyPath isEqualToString:@"num"] && object == self.myCar) {
// 响应变化处理
self.label.text = [NSString stringWithFormat:@"当前的num值为:%@",
[change valueForKey:@"new"]];
//change的使用:上文注册时,枚举为2个,所以能够提取change字典中的新、旧值的这两个方法
NSLog(@"oldnum:%@ ----newnum:%@",[change valueForKey:@"old"],
[change valueForKey:@"new"]);
}
}
复制代码
四、注销监听atom
-(void)dealloc{
// 移除KVO
[self removeObserver:self forKeyPath:@"num" context:nil];
}
复制代码
注意!同一个属性不能重复removeObserver,不然会出问题。spa
www.cnblogs.com/XYQ-208910/…设计
二者都是一对多,可是对象之间直接的交互,notification 明显得多,须要notificationCenter 来作为中间交互。而 KVO 如咱们介绍的,设置观察者->处理属性变化,至于中间通知这一环,则隐秘多了,只留一句“交由系统通知”,具体的可参照以上实现过程的剖析。代理
notification 的优势是,监听不局限于属性的变化,还能够对多种多样的状态变化进行监听,监听范围广,例如键盘、先后台等系统通知的使用也更显灵活方便。code
这两个都是负责发送接收通知,剩下的事情由系统处理,因此不用返回值;而 delegate 则须要通讯的对象经过变量(代理)联系; delegate 通常是一对一,而这两个能够一对多。