iOS開發中的kvo機制

KVO:(Key-Value-Observer)鍵值觀察者,是觀察者設計模式的一種具體實現。

KVO觸發機制:一個對象(觀察者),監測另一對象(被觀察者)的某屬性是否發⽣生變 化,若被監測的屬性發生的更改,會觸發觀察者的一個方法(方法名固定,類似代理方法)

KVO使用步驟:
 1、註冊觀察者(爲被觀察者指定觀察者以及被觀察屬性)
 2、實現回調方法
 3、觸發回調方法(被觀察屬性發⽣生更改)4、移除觀察者 

KVO使⽤用場景:MVCMC通信,M發⽣生變化通知C。其中M是被


觀察者,C是觀察者。

KVO注意事項:觀察者銷燬之前,移除觀察者,否則會出現程序異 常(給已經銷燬的對象發送消息) 

#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@property (nonatomic, retain) Person *person;
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
	
    // 初始化person
    self.person = [[Person alloc] init];
    _person.name = @"小賽賽";
    
    
    
    // 註冊監聽(observer:監聽者;forkeypath:監聽的對象的屬性,options:監聽的屬性的值是新還是舊)
    [_person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionOld context:@"讓self去監聽person.name的值"];
    
    
}
#pragma mark  當監聽的值發生改變時,此方法會被執行
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"監聽的屬性%@",keyPath);
    NSLog(@"被監聽者%@",object);
#warning ???????????
    NSLog(@"所有狀態下屬性的值%@",change);
    NSLog(@"傳遞過來的值%@", context);
  //  NSString *newName = change[NSKeyValueChangeNewKey]; // 可以獲取到屬性的新值
    NSString *oldName = change[NSKeyValueChangeOldKey]; // 可以獲取到屬性的舊值
    
    
    if (![[object name] isEqualToString:oldName]) { // 如果新舊值不一樣,就走該方法
        self.view.backgroundColor = [UIColor colorWithRed:arc4random() %256/255.0 green:arc4random() %256/255.0 blue:arc4random() %256/255.0 alpha:1.0];
        
        
    }
    
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
- (IBAction)Save:(UIButton *)sender {
    _person.name = _textField.text;
    
}

- (void)dealloc {
    [_textField release];
    [_person release];
    // 註銷監聽
    [_person removeObserver:self forKeyPath:@"name" context:@"讓self去監聽person.name的值"];
    
    
    [super dealloc];
}
@end


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章