kvo 屬性觀察者 是觀察者模式的一種具體實現,主要通過觀察物件屬性值的變化,觸發對應的方法
下面學習下 kvo 的具體實現 和 底層實現原理
原生觀察者實現
1、為 狗 物件d
新增乙個觀察者為自己, 同時監聽物件d
->age
年齡屬性的改變
dog *d = [dog new];
[p addobserver:
self
forkeypath:@"age"
options:
nskeyvalueobservingoptionnew
context:
nil];
2、實現觀察者監聽方法,實時監聽d
->age
年齡屬性的改變,並獲取改變後的new
值
- (void)observevalueforkeypath:(nsstring *)keypath ofobject:(id)object change:(nsdictionary
id> *)change context:(void *)context
3、在物件銷毀前,移除狗物件的觀察者
- (void)dealloc
系統 kvo 的底層實現原理
為這個類的物件新增觀察者(方法一)
和實現屬性變化後的動作方法(方法二)
當某個類的物件第一次被觀察時(方法一)
,系統就會在執行時動態地建立該類的乙個派生類
在這個類中實現新增觀察者方法(方法一)
,並將觀察者物件和自己關聯起來,並將指標指向生成的派生類
在這個派生類中重寫基類中被觀察屬性的setter
方法,並獲取物件的關聯物件
然後在setter
方法中,執行 關聯物件 的方法二
,觸發物件變化後的 action 動作,這樣屬性變化後的方法將會執行,達到監聽的作用
具體**實現
一、給 nsobject 新增乙個分類 (category), 新增兩個方法,並空實現
@inte***ce
nsobject (kvo)
- (void)xm_addobserver:( nsobject * _nonnull )observer forkeypath:(nsstring * _nonnull)keypath options:(nskeyvalueobservingoptions)options context:(nullable void *)context;
- (void)xm_observevalueforkeypath:(nullable nsstring *)keypath ofobject:(nullable id)object change:(nullable nsdictionary
id> *)change context:(nullable void *)context;
@end
@implementation
nsobject (kvo)
#pragma mark - 空實現
- (void)xm_addobserver:(nsobject *)observer forkeypath:(nsstring *)keypath options:(nskeyvalueobservingoptions)options context:(void *)context
- (void)xm_observevalueforkeypath:(nsstring *)keypath ofobject:(id)object change:(nsdictionary
id> *)change context:(void *)context
@end
二、為某個類的物件新增觀察者(方法一)
和實現屬性變化後的動作方法(方法二)
dog *d = [dog new];
[d xm_addobserver:
self
forkeypath:@"age"
options:
nskeyvalueobservingoptionnew
context:
nil];
- (void)xm_observevalueforkeypath:(nsstring *)keypath ofobject:(id)object change:(nsdictionary
id> *)change context:(void *)context
三、當某個類的物件第一次被觀察時(方法一)
,在執行時動態地建立該類的乙個派生類@inte***ce
kv0_dog : dog
@end
四、在這個類中實現新增觀察者方法(方法一)
,並將觀察者物件和自己關聯起來,並將指標指向生成的派生類#import "dog.h"
#import
@implementation
dog- (void)xm_addobserver:( nsobject * _nonnull )observer forkeypath:(nsstring * _nonnull)keypath options:(nskeyvalueobservingoptions)options context:(nullable void *)context
@end
五、在這個派生類中重寫基類中被觀察屬性的setter
方法,並獲取物件的關聯物件,執行關聯物件 的方法二
,觸發物件變化後的 action#import "kv0_dog.h"
#import
#import "nsobject+kvo.h"
@implementation
kv0_dog
- (void)setage:(nsinteger)age context:nil];
}@end
六、改變dog
的age
屬性,然後 步驟二的屬性觀察方法將會被執行,同時屬性改變的新值也傳遞過來了
列印結果
age------1
age------2
age------3
age------4
...
iOS KVO的實現原理
全稱是key value observing,翻譯成鍵值觀察。提供了一種當其它物件屬性被修改的時候能通知當前物件的機制。再mvc大行其道的cocoa中,kvo機制很適合實現model和controller類之間的通訊。鍵值編碼 kvc 和鍵值觀察 kvo 是根據isa swizzling技術來實現的...
iOS KVO概述(剛剛)
面試中經常會被問到 什麼是kvo?這個問題既然出現概率這麼大,那麼我們就來詳細講一講到底什麼是kvo。下次再有面試官問你的時候,你就可以娓娓道來,以彰顯高逼格 問 什麼是kvo?答 kvo是key value observing的縮寫。它提供一種機制,當指定的物件的屬性被修改後,則物件就會接受到通知...
iOS KVO 鍵值觀察
kvo 使用分三步 kvo 使用注意 在 swift 中使用 kvo 的前提條件 void addobserver nsobject observer forkeypath nsstring keypath options nskeyvalueobservingoptions options con...