【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只用来监听属性值的变化,这个发送监听的操作是系统控制 ...
随机推荐
- 转 Unicode 和 UTF-8 的区别
原文链接: Unicode 和 UTF-8 有何区别? 原作者: 邱昊宇 简单来说: Unicode 是「字符集」 UTF-8 是「编码规则」 其中: 字符集:为每一个「字符」分配一个唯一的 ID(学 ...
- java 属性封装
//封装性 //封装概念: //1.是面向对象思想的三大特征之一 //2.封装细节是隐藏的,仅对外提供访问接口 //3.封装分类: //属性封装 //方法封装 //类的封装 //组件的封装 //模块化 ...
- jenkins权限配置不对导致jenkins无法登陆
提醒:每次更改权限时,要将config.xml备份一下. 在打开jenkins后,没有创建用户前,先不要勾选系统设置中启用安全选项,如果勾选了,就会出现无法进入jenkins的现象. 如果已经勾选可以 ...
- 转:Ogre源码分析之Root类、Facade模式
Ogre源码分析(一)Root类,Facade模式 Ogre中的Root对象是一个Ogre应用程序的主入口点.因为它是整个Ogre引擎的外观(Façade)类.通过Root对象来开启和停止Ogre是最 ...
- 微信小程序即将上线,创业者机会在哪里?
作者:全栈生姜头链接:https://www.zhihu.com/question/54352253/answer/139741070来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...
- DLL中不能调用CoInitialize和CoInitializeEx
在项目中为了用API访问Wmi Object来实现命令wmic的功能,所以得使用COM库,使用COM库之前得初始化一些东西. m_hr = CoInitializeEx(, COINIT_APARTM ...
- Java Web项目总结
知识点列表(慢慢增加,红色代表公司暂时没有使用): 开发: 视图层技术——HTML,CSS,JS,AJAX,Tiles,Velocity,FreeMarker 持久层技术——MyBatis,Hiber ...
- git的几个操作
git reference https://git-scm.com/docs 克隆 从远程仓库克隆一个项目到本地文件夹,命令如下:$ git clone https://github.com/libg ...
- iOS 开发 Pch 文件的正确使用
在Xcode6之前,创建一个新工程xcode会在Supporting files文件夹下面自动创建一个“工程名-Prefix.pch”文件,也是一个头文件,pch头文件的内容能被项目中的其他所有源文件 ...
- 十五分钟介绍 Redis数据结构
下面是一个对Redis官方文档<A fifteen minute introduction to Redis data types>一文的翻译,如其题目所言,此文目的在于让一个初学者能通过 ...