1. 程式人生 > >iOS中 KVC和KVO的理解和用途

iOS中 KVC和KVO的理解和用途

KVC(Key-Value Coding)

KVC,即是指 NSKeyValueCoding,一個非正式的 Protocol,提供一種機制來間接訪問物件的屬性。

一個物件擁有某些屬性。比如說,一個 Man 物件有一個 name 和一個 age 屬性。以 KVC 說法,這個Man 物件分別有一個 value 對應他的 name 和 age 的 key。此時就涉及到 

valueForKey 的方法

key 只是一個字串,它對應的值可以是任意型別的物件,比方這個Man結婚了,新增一個key為wife的屬性,那就得有個Woman,成為他的wife,當然這個Woman也有自己的名字name 和年齡age的屬性,此時就涉及到

valueForKeyPath 的方法

從最基礎的層次上看,KVC 有兩個方法:一個是設定 key 的值,另一個是獲取 key 的值。如下面的例子:

KVO(Key-Value Observing )

Key-Value Observing (KVO) 建立在 KVC 之上,它能夠觀察一個物件的 KVC key path 值的變化。舉個例子,用程式碼觀察一個 person 物件的 address 變化,以下是實現的三個方法:

  • 新增觀察者
  • observeValueForKeyPath: ofObject: change: context:  在被觀察的 key path 的值變化時呼叫。在觀察者中實現監聽方法,(通過查閱文件可以知道,絕大多數物件都有這個方法,因為這個方法屬於NSObject)
  • dealloc 停止觀察,移除觀察者

 

我們常見一個Person物件是繼承與NSObject,有一個name屬性。我們把Person的類物件的name屬性註冊給ViewController監聽。

    self.p = [[Person alloc] init];


    //此行註冊監聽後,p由Person類變成NSKVONotyfing_Person類。

    [self.p addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];

 

//讓控制器監聽物件self.p的name屬性
//options屬性可以選擇是哪個
 /* NSKeyValueObservingOptionNew =0x01, 新值 
  * NSKeyValueObservingOptionOld =0x02, 舊值 
  */ 

#pragma mark - 實現KVO回撥方法
/* * 當物件的屬性發生改變會呼叫該方法
    * @param keyPath 監聽的屬性 
    * @param object 監聽的物件 
    * @param change 新值和舊值 
    * @param context 額外的資料 
*/


當我們點選屏幕後,改變self.p的name屬性值:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    self.p.name = @"小明";

}

這時候就會呼叫self.p的- (void)setName:(int)name;方法,  注意:此時self.p屬於NSKVONotyfing_Person類物件。

name屬性改變後,隨即呼叫KVO的監聽方法中:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {

    NSLog(@"%@監聽到%@屬性的改變為%@",

          object,keyPath,change);

}


//最後不要忘記了,去移除observer
- (void)dealloc{ 
       [self.p removeObserver:self forKeyPath:@"name"];
  }