KVC与KVO

KVC与KVO

KVC:通过key间接设置或访问对应的属性值
1.可以访问私有成员变量
2.可以间接修改私有成员变量的值
 
设值
setValue:<#(nullable id)#> forKey:<#(nonnull NSString *)#>
取值
valueForKey:<#(nonnull NSString *)#>
 
 
理解KVC的实现
1.寻找对应的setter方法赋值;如果没有setter方法
2.寻找_name变量赋值;如果没有
3.寻找name变量赋值
 
如果都找不到就抛出异常;
对未定义的key进行KVC会抛出异常,实际上他会调用
- (void)setValue:(id)value forUndefinedKey:(NSString *)key
可以重写这个方法对异常做处理
 
对Key赋值为nil时,如果key对应的属性类型不是对象时,会抛出错误,
实际上他会调用
- (void)setNilValueForKey:(NSString *)key
可以重写这个方法对异常做处理
 
********KVC的升级版(复合属性编码)
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath
 
 
-------------------------------------------------------------------------------------------
 
KVO:一个对象监听另一个对象内部属性的改变(观察者模式)
 
添加观察者
addObserver:<#(nonnull NSObject *)#> forKeyPath:<#(nonnull NSString *)#> options:<#(NSKeyValueObservingOptions)#> context:<#(nullable void *)#>
移除观察者
removeObserver:<#(nonnull NSObject *)#> forKeyPath:<#(nonnull NSString *)#> context:<#(nullable void *)#>
 
当被观察对象的key对应的属性值变化时,会回调这个方法(change字典的内容由添加观察者时的option参数所决定)
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
 
理解KVO的实现
基本的流程就是编译器自动为被观察对象创造一个派生类,并将被观察对象的isa 指向这个派生类。如果用户注册了对某此目标对象的某一个属性的观察,那么此派生类会重写这个方法,并在其中添加进行通知的代码。Objective-C 在发送消息的时候,会通过 isa 指针找到当前对象所属的类对象。而类对象中保存着当前对象的实例方法,因此在向此对象发送消息时候,实际上是发送到了派生类对象的方法。由于编译器对派生类的方法进行了 override,并添加了通知代码,因此会向注册的对象发送通知。注意派生类只重写注册了观察者的属性方法。
 
 
*******KVO特殊版
set方法能实现对象监听自己内部属性的改变(自己观察自己)
 
 
 
posted @ 2016-06-03 09:58  grace_chen  阅读(134)  评论(0)    收藏  举报