cocoa 自动键值观察(KVO)--笔录
要实现自动的键值观察,可以很简单的几行代码就能实现该功能:
程序功能描述:
建立一个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)--笔录相关推荐
- [深入浅出Cocoa]详解键值观察(KVO)及其实现机理
[深入浅出Cocoa]详解键值观察(KVO)及其实现机理 本文转载至 罗朝辉 (http://www.cppblog.com/kesalin/) 本文遵循"署名-非商业用途-保持一致& ...
- python取出字典的某个键_python 取出字典的键或者值/如何删除一个字典的键值对/如何遍历字典...
先定义一个字典并直接进行初始化赋值 my_dict = dict(name="lowman", age=45, money=998, hourse=None) 1.取出该字典所有的 ...
- JDBC学习笔记(6)——获取自动生成的主键值处理Blob数据库事务处理
获取数据库自动生成的主键 [孤立的技术是没有价值的],我们这里只是为了了解具体的实现步骤:我们在插入数据的时候,经常会需要获取我们插入的这一行数据对应的主键值. 具体的代码实现: 1 /** 2 * ...
- Android Okhttp3的使用(很全面,包含Post提交字符串、键值对、表单、上传文件、无参请求和Get有参无参请求,还有自动添加token)
Okhttp简介 okhttp是现代化应用程序的网络通信的方式.它用来帮助程序交换数据和媒体信息,使用okhttp可以让你的程序加载物料(翻译为服务器数据更合适在)更加高效.更节省网络带宽. okht ...
- vba 自动排序_给VBA字典键值排序,并提取需要的数据
未知的领域很广.风景很美,不要蜷缩在一小块自认为天堂的世界里.待到暮年时安于自欺欺人,要努力提高自己,学习是一件很辛苦的事.要有一颗充满生机的心,把握现在,这才是进取.机会总在等待中出现,越是有意义的 ...
- 你说,Redis如何实现键值自动清理?
Redis缓存作为提高系统性能最好的方式相信大家对其一定不陌生,各位秃头老码农不仅需要掌握Redis的基础用法还得了解Redis的相关原理,比如Redis过期策略和内存淘汰机制. 大家都知道,Redi ...
- 超大数据下大批量随机键值的查询优化方案
一.问题描述 键值查询是很常见的查询场景,在数据表上建有索引后,即使表中数据记录数巨大(几亿甚至几十亿行),用键值查询出单条记录也会很快,因为建立索引后的复杂度只有 logN(以 2 为底)次, 10 ...
- 超大数据下大批量随机键值的查询优化方案 1
一.问题描述 键值查询是很常见的查询场景,在数据表上建有索引后,即使表中数据记录数巨大(几亿甚至几十亿行),用键值查询出单条记录也会很快,因为建立索引后的复杂度只有 logN(以 2 为底)次, 10 ...
- linux 查询线程是否结束_批量随机键值查询测试
[摘要] 当数据量巨大时,使用大批量随机键值集获取对应记录集合,不仅仅考验数据库软件本身,更在于程序员对数据的理解!如何在硬件资源有限的情况下将性能发挥到极致?点击:批量随机键值查询测试,来乾学院一探 ...
- Dynamo:亚马逊的高可用键值存储
目录 1. 简介 2. 背景 3. 相关工作 4. 系统结构 5. 实现 6. 经验和教训 7. 结论 Dynamo:亚马逊的高可用键值存储 摘要:大规模的可靠性是我们在 Amazon.com 面临的 ...
最新文章
- 浏览器刷新再次升级!不同浏览器窗口
- 全球及中国深紫外LED行业盈利状况与前景动态研究报告2022版
- 团队任务4:第二次冲刺(Beta)
- 安卓 ce linux,手持移动数据终端的操作系统有哪些?Windows CE,Mobile和安卓各有什么优缺点?...
- jQuery添加/改变/移除CSS类
- halcon相关的链接
- onenote 思维导图_学生党做笔记,我为什么更推荐OneNote?看后你就明白了
- php session不生效_php验证session无效的解决方法
- 404 单页应用 报错 路由_单页应用
- linux连接lua遇到的问题
- umijs有什么好处_umijs核心代码解读
- FPGA如何固化程序到EPCS之入门的理想教程
- 计算机无线网卡连接网络,电脑有线网络跟无线网络无法连接,解决方法
- 使用模拟退火算法解决TSP问题
- L2-048 寻宝图(25分)
- 中科大计算机网络空间安全,2020年中国科学技术大学网络空间安全考研经验分享...
- matlab中绘制图像
- 如何下载安装python3.6.7_win764位下python3.6.5应该怎么安装
- 树莓派(Raspberry Pi)中如何改变键盘布局(打出~ # | 等符号)
- 2018最新精选的Go框架,库和软件的精选列表 四