KVC,即是指 NSKeyValueCoding,一个非正式的 Protocol,提供一种机制来间接访问对象的属性。
一个对象拥有某些属性。比如说,一个 Man 对象有一个 name 和一个 age 属性。以 KVC 说法,这个Man 对象分别有一个 value 对应他的 name 和 age 的 key。此时就涉及到
valueForKey 的方法
key 只是一个字符串,它对应的值可以是任意类型的对象,比方这个Man结婚了,新增一个key为wife的属性,那就得有个Woman,成为他的wife,当然这个Woman也有自己的名字name 和年龄age的属性,此时就涉及到
valueForKeyPath 的方法
从最基础的层次上看,KVC 有两个方法:一个是设置 key 的值,另一个是获取 key 的值。如下面的例子:
KVO(Key-Value Observing )
Key-Value Observing (KVO) 建立在 KVC 之上,它能够观察一个对象的 KVC key path 值的变化。举个例子,用代码观察一个 person 对象的 address 变化,以下是实现的三个方法:
添加观察者
observeValueForKeyPath: ofObject: change: context: 在被观察的 key path 的值变化时调用。在观察者中实现监听方法,(通过查阅文档可以知道,绝大多数对象都有这个方法,因为这个方法属于NSObject)
dealloc 停止观察,移除观察者
我们常见一个Person对象是继承与NSObject,有一个name属性。我们把Person的类对象的name属性注册给ViewController监听。
self.p = [[Person alloc] init];
//此行注册监听后,p由Person类变成NSKVONotyfing_Person类。
[self.p addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];
//让控制器监听对象self.p的name属性
//options属性可以选择是哪个
/* NSKeyValueObservingOptionNew =0x01, 新值
* NSKeyValueObservingOptionOld =0x02, 旧值
*/
#pragma mark - 实现KVO回调方法
/* * 当对象的属性发生改变会调用该方法
* @param keyPath 监听的属性
* @param object 监听的对象
* @param change 新值和旧值
* @param context 额外的数据
*/
当我们点击屏幕后,改变self.p的name属性值:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
self.p.name = @"小明";
}
这时候就会调用self.p的- (void)setName:(int)name;方法, 注意:此时self.p属于NSKVONotyfing_Person类对象。
name属性改变后,随即调用KVO的监听方法中:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
NSLog(@"%@监听到%@属性的改变为%@",
object,keyPath,change);
}
//最后不要忘记了,去移除observer
- (void)dealloc{
[self.p removeObserver:self forKeyPath:@"name"];
}
---------------------
作者:W2i0l1l5y
来源:CSDN
原文:https://blog.csdn.net/w2i0l1l5y/article/details/83575214
版权声明:本文为博主原创文章,转载请附上博文链接!
网友评论