KVC和KVO都屬於鍵值編程並且底層實現機制都是isa-swizzing,因此原本想放在一塊兒講的。可是篇幅有限因此就分紅了兩篇博文。 KVC實現機制傳送門html
鍵值觀察Key-Value-Observer就是觀察者模式。編程
當須要檢測其餘類的屬性值變化,但又不想被觀察的類知道,有點像FBI監視嫌疑人,這個時候就可使用KVO了。指針
KVO同KVC同樣都依賴於Runtime的動態機制code
//keyPath就是要觀察的屬性值 //options給你觀察鍵值變化的選擇 //context方便傳輸你須要的數據 -(void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context
//change裏存儲了一些變化的數據,好比變化前的數據,變化後的數據;若是註冊時context不爲空,這裏context就能接收到。 -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;
使用觀察者模式須要被觀察者的配合,當被觀察者的狀態發生變化的時候經過事先定義好的接口(協議)通知觀察者。在KVO的使用中咱們並不須要向被觀察者添加額外的代碼,就能在被觀察的屬性變化的時候獲得通知,這個功能是如何實現的呢?同KVC同樣依賴於強大的Runtime機制。server
系統實現KVO有如下幾個步驟:htm
KVO同KVC同樣,經過 isa-swizzling 技術來實現。當觀察者被註冊爲一個對象的屬性的觀察對象的isa指針被修改,指向一箇中間類,而不是在真實的類。其結果是,isa指針的值並不必定反映實例的實際類。對象
因此不能依靠isa指針來肯定對象是不是一個類的成員。應該使用class方法來肯定對象實例的類。blog