cocoa 自动键值观察(KVO)--笔录

cocoa 自动键值观察(KVO)--笔录,第1张

概述要实现自动的键值观察,可以很简单的几行代码就能实现该功能: 程序功能描述: 建立一个Observer(观察者)类以及一个Target(被观察者)类,通过Observer类实例对象观察Target实例对象的Age属性!也就是说, 当age的值发生变化时,Observer实例对象应该能收到通知。 代码: 1.Target.h 和Target.m文件 //// Target.h// AutoKV

要实现自动的键值观察,可以很简单的几行代码就能实现该功能:

程序功能描述:

建立一个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)--笔录所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1052374.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存