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的区别 KVC编程时setValue(value: AnyObje...

  • KVC 和 KVO

    iOS-KVC和KVO精炼讲解(干货)KVC 和 KVOiOS开发系列--Objective-C之KVC、KVO细...

  • 说一下KVC和KVO

    本篇采用简单的例子,来介绍 iOS 中的 KVC 和 KVO 的用法和实现原理。 一、KVC 1. KVC是什么 ...

  • 从网上收集的一些关键知识点总结

    iOS 中KVC、KVO、NSNotification、delegate 总结及区别

  • KVC,KVO,消息,代理

    iOS 中KVC、KVO、NSNotification、delegate 总结及区别 1、KVC,即是指 NSKe...

  • 4.iOS开发之KVC

    iOS的日常开发中KVC与KVO还是使用率蛮高的,整理一下。KVC和KVO都是基于OC的动态特性和Runtime机...

  • 5.iOS开发之KVO

    iOS的日常开发中KVC与KVO还是使用率蛮高的,整理一下。KVC和KVO都是基于OC的动态特性和Runtime机...

  • 什么是KVC

    在iOS开发过程中,我们经常会听到或者用到KVO/KVC,但是对于什么是KVO和KVC,我们可能没有那么了解。下面...

  • KVO/KVC系列

    在iOS开发过程中,我们经常会听到或者用到KVO/KVC,但是对于什么是KVO和KVC,我们可能没有那么了解。下面...

  • 知识点3

    26. 什么是KVC和KVO? KVO: iOS开发-KVO的奥秘 http://www.jianshu.com/...

网友评论

    本文标题:iOS中 KVC和KVO

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