【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只用来监听属性值的变化,这个发送监听的操作是系统控制 ...
随机推荐
- java 日期Date类型比较大小
java 日期Date类型比较大小 CreateTime--2018年5月31日16点39分 Author:Marydon import java.text.DateFormat; import ...
- 怎样解决WampServer #1405 - Access denied for user 'root'@'localhost' (using password: NO)
转载请注明出处:http://blog.csdn.net/xingjiarong/article/details/47903227 之前一直在用wampserver,然后环境配置也是正确的,可是过了一 ...
- python之模块poplib之常见用法
# -*- coding: cp936 -*- #python 27 #xiaodeng #python之模块poplib之常见用法 ''' 所以,收取邮件分两步: 第一步:用poplib把邮件的原始 ...
- Easyui入门视频教程 第02集--- ASP.NET MVC下 搭建 EasyUI环境
Easyui入门视频教程 第02集--- ASP.NET MVC下 搭建 EasyUI环境 目录 ----------------------- Easyui入门视频教程 第09集---登录完善 图标 ...
- ios中封装网络和tableview的综合运用
1:封装网络请求 类 #import <Foundation/Foundation.h> #import "ASIFormDataRequest.h" #import ...
- ios中core Plot (2)
#import "ViewController.h" @interface ViewController () //指定要画得view @property(nonatomic,as ...
- iOS中CGRectDividede中布局用法
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...
- UCCI协议[转]
象棋百科全书 中国象棋电脑应用规范(五) 中国象棋通用引擎协议 版本:3.0 象棋百科全书网 (webmaster@xqbase.com) 2004年12月初稿,2007年11月修订 一.概述 中国象 ...
- Sql Server 在数据库中所有表所有栏位 找出匹配某个值的脚本(转)
转自: http://blog.csdn.net/chenghaibing2008/article/details/11891419 (下面代码稍有修改,将要查找的内容直接作为参数传人,并且使用=而不 ...
- 树莓派进阶之路 (006) - 树莓派安装wiringPi
安装git-core sudo apt-get install git-core 下载winringPi库 git clone git://git.drogon.net/wiringPi 编译和安装库 ...