【Objective-C】OC中KVO的基本概念和使用方法
基本概念:
键值观察是一种使用获取其他对象的特定属性变化的通知机制。
控制器层的绑定技术就是严重依赖键值观察获得模型层和控制器层的变化通知的。
对于不依赖控制器层类的应用程序,键值观察提供了一种简化的方法来实现检查器
并更新用户界面值。
与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的基本概念和使用方法的更多相关文章
- 1218.1——OC中的常见关键字及一些基本方法
OC常见的关键字介绍: @ 看到这个关键字,我们就应该想到,这是Object-C对C语言的扩展,例如@interface XXX. @interface 声明类 @implementation 实现类 ...
- OC中保存自定义类型对象的持久化方法
OC中如果要将自定义类型的对象保存到文件中,必须进行以下三个条件: 想要把存放自定义类型的数组进行 持久化(就是将内存中的临时数据以文件<数据库等>的形式写到磁盘上)必须满足: 1. 自定 ...
- OC中多线程的一些概念
1.进程1.1>进程是指在系统中正在运行的一个应用程序(同时打开QQ和Xcode,系统会分别启动2个进程)1.2>每个进程之间是独立的,每个进程均运行在其专用的且受保护的内存空间内 2.线 ...
- OC中如何优化代理是否响应某个方法
看以下示例代码: if([_delegate respondsToSelector: @selector(someClassDidSomething:)){ [_delegate someClassD ...
- oc中的各种遍历(迭代)方法
转载自文顶顶老师的博客:http://www.cnblogs.com/wendingding/p/5251937.html 说明: 1)该文简短介绍在ios开发中遍历字典.数组和集合的集中常见方式 2 ...
- OC中快速创建NSNumber NSDictionary NSArray的方法
NSNumber: @() @小括号 或者 NSNumber * num = @3; NSValue * value = @4; NSDictionary :@{} @大括 ...
- OC中对象拷贝概念
OC中的对象拷贝概念,这个对于面向对象语言中都会有这种的问题,只是不同的语言有不同的解决方式:C++中有拷贝构造函数,Java中需要实现Cloneable接口,在clone方法中进行操作.但是不过OC ...
- OC中最难的一部分内容:内存管理
OC中最难的一部分内容:内存管理为什么说他难呢?因为内存如果需要我们程序员去管理的话,那个难度肯定是很大的,如果是Java,垃圾回收器会把这份工作给做了,我们不需要关心,但是就是因为如此,Androi ...
- OC中另外的一个常用技术:通知(Notification)
OC中另外的一个常用技术:通知(Nofitication)其实这里的通知和之前说到的KVO功能很想,也是用于监听操作的,但是和KVO不同的是,KVO只用来监听属性值的变化,这个发送监听的操作是系统控制 ...
随机推荐
- 创建第一个servlet程序--HelloServlet
这篇文章是用来纪念我第一次创建一个Servlet程序,步骤我会写得详细点,也可以参考一下,后续我会将SpringMVC 跟ssh的搭建分别更新(ps:不忙的话我会更新) 工具:java jdk 1.6 ...
- 【转载】Mysql主从复制、和MySQL集群(主主复制)
转载:https://www.cnblogs.com/phpstudy2015-6/p/6485819.html 请同时参考和结合这篇文件进行处理:https://blog.csdn.net/envo ...
- 查看tcp连接信息socket几个常用的命令
查看tcp连接几个常用的命令 1 ss ss 列出所有的连接,包括tcp连接.udp连接.unix socket.raw socket ss -t 列出所有tcp连接 ss -tl 列出所有处于监听状 ...
- ios中GDataXML解析XML文档
参考文章 http://blog.csdn.net/ryantang03/article/details/7868246 适合解析一个节点多个属性要用GDataXml 格式如下 <?xml ve ...
- Redability
在写爬虫进行舆情分析.情感分析等内容时,我们经常爬取博客.新闻等长篇大论的文章,在一个网页上,根据网页布局,人眼可以很明确的确定哪些元素是文章主体.人眼既然能够识别,那么机器必然也是能够识别的.如果给 ...
- 如何设置页面自动刷新第一篇?? servlet setHeader("refresh","2")
import java.io.IOException; import java.util.Random; import javax.servlet.ServletException; import j ...
- 【LeetCode】203. Remove Linked List Elements
Remove Linked List Elements Remove all elements from a linked list of integers that have value val. ...
- 树莓派进阶之路 (003) - Raspberry Pi(树莓派)国内软件源
树莓派自带的软件源是 deb http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi 由于网站在国外 ...
- XmlSerializer 对象序列化成XML 自定义编码格式(gb2312)
随着面向服务(SOA)的开发方式的兴起,客户端和服务端之间的消息传送,很多采用了XML的格式.但是大家在日常的开发中,应该会有这么种体验,就是组织xml格式的代码太繁琐,这篇随笔也是为了和大家分享下简 ...
- JQuery EasyUI combobox 省市两级联动
表名:province 结构如下 CallIn.tpl 模板页 <select id="consult_province" name="consult_provi ...