1、注冊監聽
[被監聽對象 addObserver: 監聽者
forKeyPath: 被監聽對象的屬性
options:監視内容(新值或舊值)
context:額外資訊];
2、監聽者實作監聽方法(在監聽者的類裡面實作,不實作會崩潰)
-(void)observerValueForKeyPath: (NSString*)keyPath
ofObject:(id)object (被監聽對象)
change: (NSdictionary*)change(所監對象屬性變化)
context:(void*)context
3、移除觸發條件
建立一個Student類作為被觀察的對象;接下來建立觀察者StudentObserver,StudentObserver有一個學生類型的屬性,并将自己注冊成為觀察者。重寫了觀察者的回調方法以便在被觀察者的屬性改變時收到通知,最後在dealloc方法中移除了觀察者
#import <Foundation/Foundation.h>//StudentObserver聲明部分
#import "Student.h"
@interface StudentObserver : NSObject
@property(retain,nonatomic) Student *stu;//被觀察者
-(id)initWithStu:(Student *) s;
@end
#import "StudentObserver.h"//StudentObserver實作部分
@implementation StudentObserver
-(id)initWithStu:(Student *) s{
if (self = [superinit]) {
self.stu = s;
//觀察者studentObserver,被觀察者student
//觀察學生對象age的變化,包含舊指和新值的變化同時送出給回調方法
[self.stuaddObserver:selfforKeyPath:@"age"options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOldcontext:nil];
}
returnself;
}
//重寫觀察者回調方法
//當age發生改變時自動調用
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
NSLog(@"age的舊指是%@",[change objectForKey:NSKeyValueChangeOldKey]);
NSLog(@"age的新值是%@",[change objectForKey:NSKeyValueChangeNewKey]);
-(void)dealloc{//移除觀察者
[self.sturemoveObserver:selfforKeyPath:@"age"];
[self.sturelease];
[superdealloc];
#import <Foundation/Foundation.h>//Student聲明部分
@interface Student : NSObject
@property(retain,nonatomic) NSString *name;
@property(assign,nonatomic) int age;
#import "Student.h"//Student實作部分
@implementation Student
#import <Foundation/Foundation.h>//main函數測試
#import "StudentObserver.h"
int main(int argc, constchar * argv[])
{
@autoreleasepool {
Student *stu = [Studentnew];
StudentObserver *so = [[StudentObserveralloc] initWithStu:stu];
[stu setValue:@"喜洋洋" forKey:@"name"];
[stu setValue:@"懶洋洋" forKey:@"name"];
[stu setValue:[NSNumbernumberWithInt:3] forKey:@"age"];
[stu setValue:[NSNumbernumberWithInt:4] forKey:@"age"];
NSLog(@"name is :%@,age is :%@",[stu valueForKey:@"name"], [stu valueForKey:@"age"]);
[stu release];
[so release];
}