KVC  (NSKey Value Coding) :键值编码

KVO (Key Value Observing) :键值监听

前言:我曾经用过 监听 一个音频何时结束 监听视频播放 状态等 用了这种方法 今天特地总结一下KVC 和 KVO.以方便以后深入学习与运用. 再而有了全新认识,再做更专业的总结.

KVC :  一个非正式的Protocol,提供一种机制来间接访问对象的属性。而不是通过调用Setter、Getter方法访问。

简单的说,KVC 可以不进行任何操作 就可以进行对象属性的动态读写.

KVC的操作方法由NSKeyValueCoding协议提供,而NSObject就实现了这个协议(KVC),也就是说ObjC中几乎所有的对象都支持KVC操作,常用的KVC操作方法如下:

· 动态设置: setValue:属性值 forKey:属性名(用于简单路径)、setValue:属性值 forKeyPath:属性路径(用于复合路径,例如Person有一个Account类型的属性,那么person.account就是一个复合属性)

· 动态读取: valueForKey:属性名 、valueForKeyPath:属性名(用于复合路径)

注意:

(1). key的值必须正确,如果拼写错误,会出现异常

(2). 当key的值是没有定义的,valueForUndefinedKey:这个方法会被调用,如果你自己写了这个方法,key的值出错就会调用到这里来

(3). 因为类key反复嵌套,所以有个keyPath的概念,keyPath就是用.号来把一个一个key链接起来,这样就可以根据这个路径访问下去

(4). NSArray/NSSet等都支持KVC

KVO :就是基于 KVC 实现的关键技术之一。这是一个典型的观察者模式,观察者在键值改变时会得到通知.

KVO的使用也很简单,就是简单的3步。

1.注册需要观察的对象的属性addObserver:forKeyPath:options:context:

2.实现observeValueForKeyPath:ofObject:change:context:方法,这个方法当观察的属性变化时会自动调用

3.取消注册观察removeObserver:forKeyPath:context: //在dealloc中移除观察者

注册方法的参数: 

  object : 被观察对象

  observer: 观察对象

  forKeyPath里面带上property的name,如UIView的frame、center等等

  options: 有4个值,分别是:

  NSKeyValueObservingOptionNew 把更改之前的值提供给处理方法

  NSKeyValueObservingOptionOld 把更改之后的值提供给处理方法

  NSKeyValueObservingOptionInitial 把初始化的值提供给处理方法,一旦注册,立马就会调用一次。通常它会带有新值,而不会带有旧值。

  NSKeyValueObservingOptionPrior 分2次调用。在值改变之前和值改变之后。

    注:例子里的0就代表不带任何参数进去

  context: 可以带入一些参数,其实这个挺好用的,任何类型都可以,自己强转就好了。

实现方法的参数:

  keyPath: 对应forKeyPath

  object:  被观察的对象

  change:  对应options里的NSKeyValueObservingOptionNew、NSKeyValueObservingOptionOld等

  context: 对应context

注意:

(1) 需要强调的是KVO的回调要被调用,属性必须是通过KVC的方法来修改的,如果是调用类的其他方法来修改属性,这个观察者是不会得到通知的。

(2)KVO实现原理:kvo实现通知对象的具体原理是什么呢?其实这是通过Objective-C强大的runtime运行时机制实现的。当你第一次观察某个对象时,runtime会创建一个新的继承被监听类的子类。在这个新的类中,它会重写所有被观察的key,然后将对象的isa指针指向新创建的类(oc语言中,每一个类实际上也是一个对象。每一个类也有一个isa指针)。所以对象神奇的变成了新的子类的实例。这些被重写的方法中添加了调用通知观察者的方法的代码。当一个对象的一个属性改变时,会触发setKey方法,但这个方法被重写了,并且在内部添加了发送通知机制

KVO和NSNotification的区别:

和delegate一样,KVO和NSNotification的作用也是类与类之间的通信,与delegate不同的是

1)这两个都是负责发出通知,剩下的事情就不管了,所以没有返回值;

2)delegate只是一对一,而这两个可以一对多。这两者也有各自的特点。

3)不同于KVO,NSNotification不依赖于键值监听

参考:

http://www.mamicode.com/info-detail-515516.html

http://www.cnblogs.com/kenshincui/p/3871178.html

iOS KVC 和 KVO 的学习的更多相关文章

  1. iOS:KVC和KVO

    来源:  对月流 链接:http://www.jianshu.com/p/f1393d10109d 写在前面: 关于KVC和KVO各种博客多了去了,重新整理下,就当是温习一下吧,也还算是个新手,不对的 ...

  2. [iOS] KVC 和 KVO

    开发iOS经常会看见KVO和KVC这两个概念,特地了解了一下. 我的新博客wossoneri.com link KVC Key Value Coding KVC是一种用间接方式访问类的属性的机制.比如 ...

  3. iOS KVC 和 KVO 区别简单总结

    KVC: key value coding,键值编码.是一种通过使用属性的名称(key)来间接访问对象属性的方法.这个方法可以不用通过 setter/getter 方法来访问对象的属性.该方法使用的实 ...

  4. ios开发runtime学习五:KVC以及KVO,利用runtime实现字典转模型

    一:KVC和KVO的学习 #import "StatusItem.h" /* 1:总结:KVC赋值:1:setValuesForKeysWithDictionary实现原理:遍历字 ...

  5. iOS编程——Objective-C KVO/KVC机制[转]

    这两天在看和这个相关的的内容,全部推翻重写一个版本,这是公司内做技术分享的文档总结,对结构.条理做了更清晰的调整.先找了段代码,理解下,网上看到最多的一段的关于KVC的代码 先上代码 1.     1 ...

  6. iOS编程——Objective-C KVO/KVC机制

    来源:http://blog.sina.com.cn/s/blog_b0c59541010151s0.html 这两天在看和这个相关的的内容,全部推翻重写一个版本,这是公司内做技术分享的文档总结,对结 ...

  7. 【原】iOS中KVC和KVO的区别

    在iOS开发中经常会看到KVC和KVO这两个概念,比较可能混淆,特地区分一下 KVC(Key Value Coding) 1> 概述 KVC:Key Value Coding,键值编码,是一种间 ...

  8. iOS中关于KVC与KVO知识点

    iOS中关于KVC与KVO知识点 iOS中关于KVC与KVO知识点  一.简介 KVC/KVO是观察者模式的一种实现,在Cocoa中是以被万物之源NSObject类实现的NSKeyValueCodin ...

  9. iOS开发中KVC、KVO简介

    在iOS开发中,KVC和KVO是经常被用到的.可以使用KVC对对象的属性赋值和取得对象的属性值,可以使用KVO监听对象属性值的变化.简单介绍一下KVC和KVO. 一:键值编码(KVC) KVC,全称 ...

随机推荐

  1. jedis连接池的参数配置

     <!-- 连接池的配置信息 --> <bean id="jedisConfig" class="redis.clients.jedis.Jedis ...

  2. plsql programming 10 日期和时间戳

    年 月 日 时 分 秒 时区 用小时表示的相对于 UTC 的时差 用分钟表示的相对于 UTC 的时差 date 存储日期和时间, 不带时区, 精确到秒 timestamp 存储日期和时间, 不带时区, ...

  3. 【转】Junit初体验

    Junit是用来做测试的,无论是单元测试,还是接口测试,都可以通过调用Junit来验证被调用方法的正确性.当然,要验证一个方法的正确性,还可以采用main方法,通过输出每一个result,人为比对其正 ...

  4. Spring MVC多动作控制器

    以下示例演示如何使用Spring Web MVC框架的多动作控制器. MultiActionController类用于在单个控制器中分别映射多个URL到对应的方法. 所下所示配置 - package ...

  5. Web里URL空格的转换方法

    今天收到一个Bug修复的任务,Bug为在页面上输入一个文件夹名包含空格,点击该文件夹的URL后链接错误. 看URL是HttpUtility.UrlEncode将空格转换成了“+”号,原因找到就着手解决 ...

  6. iOS 阿里百川SDK集成注意点

    百川SDK是阿里系OneSDK的终极版本,里面包含了所有的阿里系的基本所有的SDK,集成的时候你只需要勾选对应的你需要的模块,然后生成对应的SDK即可,百川主要是针对帮助APP开发者在各种场景下快速. ...

  7. 【转】火狐右键google搜索特别慢的解决办法

    原网页:http://www.fatalist.im/blog/459.html google将谷歌中文网站google.cn的搜索服务转向到google.com.hk(香港)后,firefox右上角 ...

  8. eclipse4.2+安装modelgoon插件,该插件支持在eclipse直接依据java文件生产类图

    安装条件: 1. 确保JDK环境OK 2.该插件安装是基于eclipse kepler(4.2) (并非表示其它版本号不能安装,仅仅是博主仅仅在4.2版本号上測试了.预计4.3版本号还是支持的,可是3 ...

  9. hibernate 懒加载图解

  10. 使用jquery-tmpl使JavaScript与HTML分离

    背景:由于对JavaScript字符串拼接JavaScript变量产生了反感,也想用用JavaScript模板库,看了几个,由于时间原因选择了jQuery.tmpl.js,因为Visual Studi ...