KVO

1.注册观察者,实施监听;

2.在回调方法中处理属性发生的变化;

3.移除观察者

A.注册观察者:

//第一个参数 observer:观察者 (这里观察self.myKVO对象的属性变化)//第二个参数 keyPath: 被观察的属性名称(这里观察 self.myKVO 中 num 属性值的改变)//第三个参数 options: 观察属性的新值、旧值等的一些配置(枚举值,可以根据需要设置,例如这里可以使用两项)//第四个参数 context: 上下文,可以为 KVO 的回调方法传值(例如设定为一个放置数据的字典)[self.myKVO addObserver:selfforKeyPath:@"num"options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNewcontext:nil];

B. 属性(keyPath)的值发生变化时,收到通知,调用以下方法:

//keyPath:属性名称//object:被观察的对象//change:变化前后的值都存储在 change 字典中//context:注册观察者时,context 传过来的值-(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void*)context{}

[self removeObserver:selfforKeyPath:@"num"context:nil];


1.KVC 与 KVO 的不同?

KVC(键值编码),即 Key-Value Coding,一个非正式的 Protocol,使用字符串(键)访问一个对象实例变量的机制。而不是通过调用 Setter、Getter 方法等显式的存取方式去访问。

KVO(键值监听),即 Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,对象就会接受到通知,前提是执行了 setter 方法、或者使用了 KVC 赋值。

2.和 notification(通知)的区别?

notification 比 KVO 多了发送通知的一步。

两者都是一对多,但是对象之间直接的交互,notification 明显得多,需要notificationCenter 来做为中间交互。而 KVO 如我们介绍的,设置观察者->处理属性变化,至于中间通知这一环,则隐秘多了,只留一句“交由系统通知”,具体的可参照以上实现过程的剖析。

notification 的优点是监听不局限于属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,例如键盘、前后台等系统通知的使用也更显灵活方便。

3.与 delegate 的不同?

和 delegate 一样,KVO 和 NSNotification 的作用都是类与类之间的通信。但是与 delegate 不同的是:

这两个都是负责发送接收通知,剩下的事情由系统处理,所以不用返回值;而 delegate 则需要通信的对象通过变量(代理)联系;

delegate 一般是一对一,而这两个可以一对多。

4.涉及技术:

KVC/KVO 实现的根本是 Objective-C 的动态性和 Runtime ,以及访问器方法的实现;

你可能感兴趣的:(KVO)