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方法能实现对象监听自己内部属性的改变(自己观察自己)
得过且过是一天
认认真真也是一天!

浙公网安备 33010602011771号