iOS中 KVC和KVO的理解和用途

KVC(Key-Value Coding)

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"];
  }

猜你喜欢

转载自blog.csdn.net/W2i0l1l5y/article/details/83575214