基本概念:
键值观察是一种使用获取其他对象的特定属性变化的通知机制。
控制器层的绑定技术就是严重依赖键值观察获得模型层和控制器层的变化通知的。
对于不依赖控制器层类的应用程序,键值观察提供了一种简化的方法来实现检查器
并更新用户界面值。
与NSNotification不同,键值观察中并没有所谓的中心对象来为所有观察者提供
变化通知。取而代之的,当有变化发生时,通知呗直接发送至处于观察状态对象。
NSObject提供这种基础的键值观察实现方法,你几乎不用重写这些方法。
可以观察任何对象属性,包括基本数据类型属性,对一或是对多关系。对多关系
的观察者将会被告知发生变化的类型,也就是任意发生变化的对象。
键值观察为所有对象提欧诺个自动观察兼容性,你可以通过禁用通过并实现手动
通知来筛选通知。
注册观察者:
为了正确接受属性的变更通知,观察对象必须首先发送一个
addObserver:forKeyPath:options:context:消息至被观察对象,用以传送观察对象和需要
观察的属性的关键路径,以便与其注册。选项参数指定了发送变更通知时提供给观察者的
信息。使用NSKeyValueObservingOptionsOld选择可以将初始对象值以变更字典中的一个项
的形式提供给观察者。指定NSKeyValueObservingOptionsNew选择可以将新的值以一个项
的形式添加至变更字典。你可以使用逐位“|”这两个常量来指定接受上述两种类型的值。
实例如下:
[person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionOld
|NSKeyValueObservingOptionNew context:nil];
接下来看个实例:
Nurse.h头文件:
#import <Foundation/Foundation.h> @class Person; @interface Nurse : NSObject @property(nonatomic,retain)Person *person; -(id)initWithPerson:(Person *)person; @endNurse.m实现文件:
#import "Nurse.h" #import "Person.h" @implementation Nurse -(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]; } @endPerson.h头文件:
#import <Foundation/Foundation.h> @interface Person : NSObject @property (nonatomic,assign)NSUInteger happyVal; @endPerson.m头文件:
#import "Person.h" @implementation Person -(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--; } @endmain.m测试文件:
#import <Foundation/Foundation.h> #import "Person.h" #import "Nurse.h" int main(int argc, const char * argv[]) { @autoreleasepool { Person *person=[[Person alloc]init]; Nurse *nurse=[[Nurse alloc]initWithPerson:person]; [[NSRunLoop currentRunLoop]run]; } return 0; }运行截图:
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
名称栏目:【Objective-C】OC中KVO的基本概念和使用方法-创新互联
文章链接:https://www.cdcxhl.com/article38/coeppp.html
成都网站建设公司_创新互联,为您提供自适应网站、网站设计、关键词优化、域名注册、品牌网站建设、移动网站建设
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联