要实现自动的键值观察,可以很简单的几行代码就能实现该功能:

程序功能描述:

建立一个Observer(观察者)类以及一个Target(被观察者)类,通过Observer类实例对象观察Target实例对象的Age属性!也就是说,

当age的值发生变化时,Observer实例对象应该能收到通知。

代码:

1.Target.h 和Target.m文件

//
//  Target.h
//  AutoKVO
//
//  Created by fenglh on 14-7-31.
//  Copyright (c) 2014年 yons. All rights reserved.
//#import <Foundation/Foundation.h>@interface Target : NSObject
@property   int age;  // for auto KVO @end
//
//  Target.m
//  AutoKVO
//
//  Created by fenglh on 14-7-31.
//  Copyright (c) 2014年 yons. All rights reserved.
//#import "Target.h"@implementation Target
@synthesize age;    // for auto KVO@end

Target类,就这么简单的定义,可以看出来,它只声明了和定义一个age变量!注意,它是用@property 和@systhesize 两个关键字来声明和定义的!!

2.Observer.h 和 Observer.m文件

//
//  Observer.h
//  AutoKVO
//
//  Created by fenglh on 14-7-31.
//  Copyright (c) 2014年 yons. All rights reserved.
//#import <Foundation/Foundation.h>@interface Observer : NSObject@end
//
//  Observer.m
//  AutoKVO
//
//  Created by fenglh on 14-7-31.
//  Copyright (c) 2014年 yons. All rights reserved.
//#import "Observer.h"@implementation Observer
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{if ([keyPath isEqualToString:@"age"]) {Class classInfo = context;NSString *className = [classInfo class];NSLog(@" >> class : [%@] , Age changed", className);NSLog(@" >> old age is %@", [change objectForKey:@"old"]);NSLog(@" >> old age is %@", [change objectForKey:@"new"]);}else{[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];}
}
@end

可以看得出来,Observer类基本上什么都没有做,它就实现了一个类对象的实例方法:observerValueForKeyPath。

3. main.m 文件

//
//  main.m
//  AutoKVO
//
//  Created by fenglh on 14-7-31.
//  Copyright (c) 2014年 yons. All rights reserved.
//#import <Foundation/Foundation.h>
#import "Observer.h"
#import "Target.h"
int main(int argc, const char * argv[])
{@autoreleasepool {Observer *observer = [[[Observer alloc] init] autorelease];Target * target = [[[Target alloc] init] autorelease];[target addObserver:observer forKeyPath:@"age" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:[Target class]]; [target setAge:500];[target removeObserver:observer forKeyPath:@"age"];}return 0;
}

main文件中,要点有三个:

1)将观察者和被观察者注册,即addObserver函数,为消息接收者添加观察者。

2)使用setAge这种默认访问方法来改变写值。

3)解除注册removeObserver (不调用该方法,编译器会打印出一堆信息说,你的KVO还在注册)

4.小结:

实现自动的键值观察(KVO)的要素:

1) age的声明和定义必须要用@property和@synthesize; //

2)观察者类要实现observeValueForKeyPath 方法来接受处理变更的通知

3)将观察者和被观察者注册,如[target addObserver:...] ,

4)使用默认的属性访问方法来改写属性的值,如[target setAge:500];

5)解除注册。

6. 其他

想了解手动的KVO以及为什么自动的KVO要这样实现,可以看下面的参考文章。

参考文章:

[深入浅出Cocoa]详解键值观察(KVO)及其实现机理     (讲得很详细)

KVO键-值观察编程指南

注:本文章大部分都是参考网络其他的文章,不足之处请多多指教。此处只为了作笔记之。2014-07-30  凌晨

cocoa 自动键值观察(KVO)--笔录相关推荐

  1. [深入浅出Cocoa]详解键值观察(KVO)及其实现机理

    [深入浅出Cocoa]详解键值观察(KVO)及其实现机理 本文转载至    罗朝辉 (http://www.cppblog.com/kesalin/) 本文遵循"署名-非商业用途-保持一致& ...

  2. python取出字典的某个键_python 取出字典的键或者值/如何删除一个字典的键值对/如何遍历字典...

    先定义一个字典并直接进行初始化赋值 my_dict = dict(name="lowman", age=45, money=998, hourse=None) 1.取出该字典所有的 ...

  3. JDBC学习笔记(6)——获取自动生成的主键值处理Blob数据库事务处理

    获取数据库自动生成的主键 [孤立的技术是没有价值的],我们这里只是为了了解具体的实现步骤:我们在插入数据的时候,经常会需要获取我们插入的这一行数据对应的主键值. 具体的代码实现: 1 /** 2 * ...

  4. Android Okhttp3的使用(很全面,包含Post提交字符串、键值对、表单、上传文件、无参请求和Get有参无参请求,还有自动添加token)

    Okhttp简介 okhttp是现代化应用程序的网络通信的方式.它用来帮助程序交换数据和媒体信息,使用okhttp可以让你的程序加载物料(翻译为服务器数据更合适在)更加高效.更节省网络带宽. okht ...

  5. vba 自动排序_给VBA字典键值排序,并提取需要的数据

    未知的领域很广.风景很美,不要蜷缩在一小块自认为天堂的世界里.待到暮年时安于自欺欺人,要努力提高自己,学习是一件很辛苦的事.要有一颗充满生机的心,把握现在,这才是进取.机会总在等待中出现,越是有意义的 ...

  6. 你说,Redis如何实现键值自动清理?

    Redis缓存作为提高系统性能最好的方式相信大家对其一定不陌生,各位秃头老码农不仅需要掌握Redis的基础用法还得了解Redis的相关原理,比如Redis过期策略和内存淘汰机制. 大家都知道,Redi ...

  7. 超大数据下大批量随机键值的查询优化方案

    一.问题描述 键值查询是很常见的查询场景,在数据表上建有索引后,即使表中数据记录数巨大(几亿甚至几十亿行),用键值查询出单条记录也会很快,因为建立索引后的复杂度只有 logN(以 2 为底)次, 10 ...

  8. 超大数据下大批量随机键值的查询优化方案 1

    一.问题描述 键值查询是很常见的查询场景,在数据表上建有索引后,即使表中数据记录数巨大(几亿甚至几十亿行),用键值查询出单条记录也会很快,因为建立索引后的复杂度只有 logN(以 2 为底)次, 10 ...

  9. linux 查询线程是否结束_批量随机键值查询测试

    [摘要] 当数据量巨大时,使用大批量随机键值集获取对应记录集合,不仅仅考验数据库软件本身,更在于程序员对数据的理解!如何在硬件资源有限的情况下将性能发挥到极致?点击:批量随机键值查询测试,来乾学院一探 ...

  10. Dynamo:亚马逊的高可用键值存储

    目录 1. 简介 2. 背景 3. 相关工作 4. 系统结构 5. 实现 6. 经验和教训 7. 结论 Dynamo:亚马逊的高可用键值存储 摘要:大规模的可靠性是我们在 Amazon.com 面临的 ...

最新文章

  1. 浏览器刷新再次升级!不同浏览器窗口
  2. 全球及中国深紫外LED行业盈利状况与前景动态研究报告2022版
  3. 团队任务4:第二次冲刺(Beta)
  4. 安卓 ce linux,手持移动数据终端的操作系统有哪些?Windows CE,Mobile和安卓各有什么优缺点?...
  5. jQuery添加/改变/移除CSS类
  6. halcon相关的链接
  7. onenote 思维导图_学生党做笔记,我为什么更推荐OneNote?看后你就明白了
  8. php session不生效_php验证session无效的解决方法
  9. 404 单页应用 报错 路由_单页应用
  10. linux连接lua遇到的问题
  11. umijs有什么好处_umijs核心代码解读
  12. FPGA如何固化程序到EPCS之入门的理想教程
  13. 计算机无线网卡连接网络,电脑有线网络跟无线网络无法连接,解决方法
  14. 使用模拟退火算法解决TSP问题
  15. L2-048 寻宝图(25分)
  16. 中科大计算机网络空间安全,2020年中国科学技术大学网络空间安全考研经验分享...
  17. matlab中绘制图像
  18. 如何下载安装python3.6.7_win764位下python3.6.5应该怎么安装
  19. 树莓派(Raspberry Pi)中如何改变键盘布局(打出~ # | 等符号)
  20. 2018最新精选的Go框架,库和软件的精选列表 四

热门文章

  1. react-navigation之navigate
  2. 精密划片机维护及保养
  3. 关于robots协议
  4. zblog php robots,怎么写ZBlogPHP网站的robots.txt
  5. 关于destoon系统遇到的一些问题总结
  6. 史上最强Java生成chm的教程(上)
  7. error:failed to run html help compiler on index.hhp
  8. Notepad++ 替代品开源了,好用 !!!
  9. php面向对象常见的专业术语
  10. phyton题库+解析