iOS中 KVC和KVO

作者: focusHYD | 来源:发表于2019-02-19 17:32 被阅读28次

    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

    版权声明:本文为博主原创文章,转载请附上博文链接!


    相关文章

      网友评论

        本文标题:iOS中 KVC和KVO

        本文链接:https://www.haomeiwen.com/subject/afmfyqtx.html