基本概念:

键值观察是一种使用获取其他对象的特定属性变化的通知机制。

控制器层的绑定技术就是严重依赖键值观察获得模型层和控制器层的变化通知的。

对于不依赖控制器层类的应用程序,键值观察提供了一种简化的方法来实现检查器

并更新用户界面值。

与NSNotification不同,键值观察中并没有所谓的中心对象来为所有观察者提供

变化通知。取而代之的,当有变化发生时,通知呗直接发送至处于观察状态对象。

NSObject提供这种基础的键值观察实现方法,你几乎不用重写这些方法。

可以观察任何对象属性,包括基本数据类型属性,对一或是对多关系。对多关系

的观察者将会被告知发生变化的类型,也就是任意发生变化的对象。

键值观察为所有对象提欧诺个自动观察兼容性,你可以通过禁用通过并实现手动

通知来筛选通知。

注册观察者:

为了正确接受属性的变更通知,观察对象必须首先发送一个

addObserver:forKeyPath:options:context:消息至被观察对象,用以传送观察对象和需要

观察的属性的关键路径,以便与其注册。选项参数指定了发送变更通知时提供给观察者的

信息。使用NSKeyValueObservingOptionsOld选择可以将初始对象值以变更字典中的一个项

的形式提供给观察者。指定NSKeyValueObservingOptionsNew选择可以将新的值以一个项

的形式添加至变更字典。你可以使用逐位“|”这两个常量来指定接受上述两种类型的值。

实例如下:

[person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionOld

|NSKeyValueObservingOptionNew context:nil];
接下来看个实例:

Nurse.h头文件:

#import <Foundation/Foundation.h>@classPerson;@interfaceNurse:NSObject@property(nonatomic,retain)Person*person;-(id)initWithPerson:(Person*)person;@end

Nurse.m实现文件:

#import "Nurse.h"#import "Person.h"@implementationNurse-(id)initWithPerson:(Person*)person{
self=[super init];if(self!=nil){
_person=[person retain];[_person addObserver:self forKeyPath:@"happyVal" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];}return self;}//实现非正式协议方法 -(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context{NSLog(@"%@",change);}-(void)dealloc{[_person release];[super dealloc];}@end

Person.h头文件:

#import <Foundation/Foundation.h>@interfacePerson:NSObject@property(nonatomic,assign)NSUInteger happyVal;@end

Person.m头文件:

#import "Person.h"@implementationPerson-(id)init{
self=[super init];if(self!=nil){
self.happyVal=100;[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeAction:) userInfo:nil repeats:YES];}return self;}-(void)timeAction:(NSTimer*)timer{
self.happyVal--;}@end

main.m测试文件:

#import <Foundation/Foundation.h>#import "Person.h"#import "Nurse.h"int main(int argc,constchar* argv[]){@autoreleasepool{Person*person=[[Person alloc]init];Nurse*nurse=[[Nurse alloc]initWithPerson:person];[[NSRunLoop currentRunLoop]run];}return0;}

运行截图:

【Objective-C】OC中KVO的基本概念和使用方法的更多相关文章

  1. 1218.1——OC中的常见关键字及一些基本方法

    OC常见的关键字介绍: @ 看到这个关键字,我们就应该想到,这是Object-C对C语言的扩展,例如@interface XXX. @interface 声明类 @implementation 实现类 ...

  2. OC中保存自定义类型对象的持久化方法

    OC中如果要将自定义类型的对象保存到文件中,必须进行以下三个条件: 想要把存放自定义类型的数组进行 持久化(就是将内存中的临时数据以文件<数据库等>的形式写到磁盘上)必须满足: 1. 自定 ...

  3. OC中多线程的一些概念

    1.进程1.1>进程是指在系统中正在运行的一个应用程序(同时打开QQ和Xcode,系统会分别启动2个进程)1.2>每个进程之间是独立的,每个进程均运行在其专用的且受保护的内存空间内 2.线 ...

  4. OC中如何优化代理是否响应某个方法

    看以下示例代码: if([_delegate respondsToSelector: @selector(someClassDidSomething:)){ [_delegate someClassD ...

  5. oc中的各种遍历(迭代)方法

    转载自文顶顶老师的博客:http://www.cnblogs.com/wendingding/p/5251937.html 说明: 1)该文简短介绍在ios开发中遍历字典.数组和集合的集中常见方式 2 ...

  6. OC中快速创建NSNumber NSDictionary NSArray的方法

    NSNumber: @()     @小括号 或者        NSNumber * num = @3;    NSValue * value = @4; NSDictionary :@{} @大括 ...

  7. OC中对象拷贝概念

    OC中的对象拷贝概念,这个对于面向对象语言中都会有这种的问题,只是不同的语言有不同的解决方式:C++中有拷贝构造函数,Java中需要实现Cloneable接口,在clone方法中进行操作.但是不过OC ...

  8. OC中最难的一部分内容:内存管理

    OC中最难的一部分内容:内存管理为什么说他难呢?因为内存如果需要我们程序员去管理的话,那个难度肯定是很大的,如果是Java,垃圾回收器会把这份工作给做了,我们不需要关心,但是就是因为如此,Androi ...

  9. OC中另外的一个常用技术:通知(Notification)

    OC中另外的一个常用技术:通知(Nofitication)其实这里的通知和之前说到的KVO功能很想,也是用于监听操作的,但是和KVO不同的是,KVO只用来监听属性值的变化,这个发送监听的操作是系统控制 ...

随机推荐

  1. Flash 矢量图和位图性能对比 导出为位图/缓存为位图 export as bitmap / cache as bitmap

     大家都知道Flash处理矢量图比位图要慢,而具体的性能上对比也有不少的前人已经做过.http://bbs.9ria.com/forum.php?mod=viewthread&tid=2282 ...

  2. Xamarin.Android之定位

    一.前言 打开我们手中的应用,可以发现越来越多的应用使用了定位,从而使我们的生活更加方便,所以本章我们将学习如何在Xamarin中进行定位的开发. 二.准备工作 因为我们的虚拟机是运行在电脑本地的,自 ...

  3. ROS知识(15)----Actionlib的使用(一)

    Actionlib是ROS非常重要的库,像执行各种运动的动作,例如控制手臂去抓取一个杯子,这个过程可能复杂而漫长,执行过程中还可能强制中断或反馈信息,这时Actionlib就能大展伸手了. 1.原理 ...

  4. 阿里云安装jdk,tomcat,maven,svn,git,nginx

    1. 首先通过xftp等工具上传安装包 2. 配置目录 cd usr mkdir java cd java mkdir jdk mkdir tomcatmkdir maven 3. 安装jdk 3.1 ...

  5. ios中封装九宫格的使用(二级导航)

    效果图 一般用于导航功能 第一步下载http://pan.baidu.com/share/link?shareid=1824940819&uk=923776187 第二步 把下图内容放在你的x ...

  6. IPsec ISAKMP(转)

    IPsec ISAKMP 2010-08-10 11:47:01 标签:IPsec 职场 休闲 ISAKMP Interne 安全连接和密钥管理协议(ISAKMP)是 IPsec 体系结构中的一种主要 ...

  7. ipsec协议(转)

    from:http://lulu1101.blog.51cto.com/4455468/816875 ipsec协议 2012-03-25 23:40:28 标签:休闲 ipsec协议 职场 IPSe ...

  8. 【Android】详解Android的menu菜单

    在软件应用过程中,菜单的存在是必不可少的,我这次讲一下,我对android菜单的一个基础做法吧 Android的菜单分为三种类型:选项菜单(Option Menu).上下文菜单(Context Men ...

  9. 【JQuery】jQuery中的常用方法小结

    1.层级选择器     后代选择器     "父元素  后代元素" 比如:$("div p") 选取div元素下所有的p元素 子元素选择器   "父元 ...

  10. 【java】详解JDK的安装和配置

    目录结构: contents structure [+] 什么是JDK JDK的三个版本 JDK包含的主要内容 JDK的安装 JDK的配置 配置JAVA_HOME 配置PATH 到底自己需不需要配置C ...