天天看點

KVO

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];

       }

KVO

繼續閱讀