代理,通知,kvo

weixin_33912445發表於2017-11-06

代理:一般控制元件用的比較多,其實也可以用block實現,如果實現的介面比較多的話,建議用代理,如UITableview。

通知:是全域性的,而且是同步的,如果你要全域性傳送訊息,並且做的事情時間不長,不會阻塞執行緒的話,建議使用。

KVO(Key-Value Observing):它提供一種機制,當指定的物件的屬性被修改後,則物件就會接受到通知。簡單的說就是每次指定的被觀察的物件的屬性被修改後,KVO就會自動通知相應的觀察者了。
KVO是建立在KVC的基礎之上的,它通過 key path 觀察物件的值,當值發生變化的時候會收到通知。比如,你需要監聽UITableview的contentoffset那麼當,tableview滑動的時候,就會不停的收到contentoffset point值。你要監聽某一物件的值的時候,建議使用。

使用方法:

  • 註冊,指定被觀察者的屬性
  • 實現回撥方法
  • 移除觀察
stockForKVO = [[StockData alloc] init];  
[stockForKVO setValue:@"searph" forKey:@"stockName"];  
[stockForKVO setValue:@"10.0" forKey:@"price"];      
[stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];  

實現回撥方法

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context  
{  
    if([keyPath isEqualToString:@"price"])  
    {  
        myLabel.text = [stockForKVO valueForKey:@"price"];  
    }  
}  

在最後的時候,移除觀察者

- (void)dealloc  
{  
    [stockForKVO removeObserver:self forKeyPath:@"price"];   
} 

KVC(Key Value Coding):除了一般的賦值和取值的方法,我們還可以用Key-Value-Coding(KVC)鍵值編碼來訪問你要存取的類的屬性。

Student *student = [[[Student alloc]init ]autorelease];
[student setValue:@"張三" forKey:@"name"];
NSString *name = [student valueForKey:@"name"];
NSLog(@"學生姓名:%@",name);