iOS学习笔记05—Key-Value-Observing(KVO,键值观察)
1、什么是KVO?
Key-Value-Observing(KVO,键值观察):当指定的对象的属性被修改了,允许对象接受到通知的机制。每次指定的被观察对象的属性被修改的时候,KVO都会自动的去通知相应的观察者。
2、KVO有什么优点?
当有属性改变,KVO会提供自动的消息通知。
3、KVO实现
1)注册观察者(Registering as an Observer),指定被观察的属性。
addObserver:forKeyPath:options:context:
2)接收变化通知(Receiving Notification of a Change),实现回调方法。
observeValueForKeyPath:ofObject:change:context:
3)移除观察者(Removing an Object as an Observer)
removeObserver:forKeyPath:
4、简单示例
1)创建一个简单的SingleView模板的iPhone应用,我取名为KVODemo。
2)在界面添加一个label和一个button,并生成相应的outlet。
下面ViewConroller.h和ViewConroller.m
ViewConroller.h源码清单:
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (retain,nonatomic)IBOutlet UILabel *label;
- (IBAction)buttonPressed:(UIButton *)sender;
@end
ViewConroller.m源码清单:
#import "ViewController.h"
@interface ViewController (){
NSString *_str;
}
@property (nonatomic,retain) NSString *str;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
_str =@"sharon";
_label.text = _str;
// 添加Observer 这样被注册的属性发生改变的时候Observer回调方法就被调用
[selfaddObserver:selfforKeyPath:@"str"options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOldcontext:nil];
}
- (IBAction)buttonPressed:(UIButton *)sender {
staticBOOL flag =YES;
if (flag) {
// 修改正在监听的属性值
[selfsetValue:@"joe"forKey:@"str"];
}else {
// 修改正在监听的属性值
[selfsetValue:@"sharon"forKey:@"str"];
}
flag = !flag;
}
// 实现Observer的回调方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
// 如果改变的属性是"name"
if ([keyPathisEqualToString:@"str"]) {
_label.text = [self valueForKey:@"str"];
// 输出改变前的值
NSLog(@"old str is %@",[changeobjectForKey:@"old"]);
// 输出改变后的值
NSLog(@"new str is %@",[changeobjectForKey:@"new"]);
}
}
-(void)dealloc{
// 移除Observer
[selfremoveObserver:selfforKeyPath:@"name"];
[super dealloc];
}
@end