KVO 即key(键)-value(值) observer(观察),是绑定技术中的一种常用模型,它可以使一个对象的某一个属性值发生变化时主动通知另一个对象,并触发相应的方法,下面的代码,当subject的name属性改变后,subject会自动通知observer对象,observer对象接受到消息后执行NSLog语句
// main.m
// dd
//
// Created by xingjunchao on 14-8-4.
// Copyright (c) 2014年 邢俊超. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "subject.h"
#import "observer.h"
#import "AppDelegate.h"
int main(int argc,char * argv[])
{
@autoreleasepool {
subject* sub=[[[subjectalloc]init]autorelease];
observer* obs=[[[observeralloc]init]autorelease];
[sub addObserver:obsforKeyPath:@"name"options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld)context:NULL ];
NSString* str=@"crystal";
[subsetValue:str forKeyPath:@"name"];
[sub removeObserver:obsforKeyPath:@"name"];
returnUIApplicationMain(argc, argv, nil,NSStringFromClass([AppDelegateclass]));
}
}
// subject.h
// dd
//
// Created by xingjunchao on 14-8-4.
// Copyright (c) 2014年 邢俊超. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface subject :NSObject
@property(nonatomic,retain)NSString* name;
@end
// subject.m
// dd
//
// Created by xingjunchao on 14-8-4.
// Copyright (c) 2014年 邢俊超. All rights reserved.
//
#import "subject.h"
@implementation subject
@synthesize name=_name;
+(BOOL)automaticallyNotifiesObserversForKey:(NSString *)key
{
if([keyisEqualToString:@"name"])
{
return YES;
}
return [superautomaticallyNotifiesObserversForKey:key];
}
@end
// observer.h
// dd
//
// Created by xingjunchao on 14-8-5.
// Copyright (c) 2014年 邢俊超. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface observer :NSObject
@end
// observer.m
// dd
//
// Created by xingjunchao on 14-8-5.
// Copyright (c) 2014年 邢俊超. All rights reserved.
//
#import "observer.h"
@implementation observer
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if([keyPath isEqual:@"name"])
{
NSLog(@"has changed become %@",[changeobjectForKey:NSKeyValueChangeNewKey ]);
}
else
{
[superobserveValueForKeyPath:keyPath ofObject:object change:change context:context ];
}
}
@end