標籤:執行個體 ios kvo
KVO概述:KVO,即:Key-Value Observing,直譯為:基於鍵值的觀察者。 它提供一種機制,當指定的對象的屬性被修改後,則對象就會接受到通知。簡單的說就是每次指定的被觀察的對象的屬性被修改後,KVO就會自動通知相應的觀察者了。
KVO的優點:當有屬性改變,KVO會提供自動的訊息通知。這樣開發人員不需要自己去實現這樣的方案:每次屬性改變了就發送訊息通知。這是KVO機制提供的最大的優點。因為這個方案已經被明確定義,獲得架構級支援,可以方便地採用。開發人員不需要添加任何代碼,不需要設計自己的觀察者模型,直接可以在工程裡使用。其次,KVO的架構非常的強大,可以很容易的支援多個觀察者觀察同 一個屬性,以及相關的值。
使用步驟如下:1. 註冊,指定被觀察者的屬性 -(void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context keyPath就是要觀察的屬性值,options給你觀察鍵值變化的選擇,而context方便傳輸你需要的資料(注意這是一個void型)2. 實現回調方法 -(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context change裡儲存了一些變化的資料,比如變化前的資料,變化後的資料;如果註冊時context不為空白,這裡context就能接收到。是自動調用的,只要你所監聽對象的屬性或者執行個體變數發生變化,就自動調用該函數,執行相應操作3. 觸發回調方法執行個體理解代碼
#import "ViewController.h"@interface ViewController ()@end@implementation ViewController{ NSString *kkk; NSMutableDictionary *xxx; }- (IBAction)btntest:(id)sender { [self setValue:@"222" forKey:@"kkk"]; NSMutableDictionary *ccc = [[NSMutableDictionary alloc] init]; [ccc setObject:@"v" forKey:@"k"]; [self setValue:ccc forKey:@"xxx"];}- (void)viewDidLoad { [super viewDidLoad]; xxx = [[NSMutableDictionary alloc] init]; [self setValue:@"111" forKey:@"kkk"]; [self addObserver:self forKeyPath:@"kkk" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL]; NSMutableDictionary *zzz = [[NSMutableDictionary alloc] init]; [self setValue:zzz forKey:@"xxx"]; [self addObserver:self forKeyPath:@"xxx" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];}-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ if([keyPath isEqualToString:@"kkk"]) { NSString *old = [change valueForKey:@"old"]; NSString *new = [change valueForKey:@"new"]; NSLog(@"old=%@,new=%@", old, new); } if([keyPath isEqualToString:@"xxx"]) { NSMutableDictionary *old = [change valueForKey:@"old"]; NSMutableDictionary *new = [change valueForKey:@"new"]; NSLog(@"old=%ld,new=%ld,xxx=%ld", [old count], [new count], [xxx count]); }}- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated.}@end
iOS 索引值觀察(KVO)簡述及執行個體理解