iOS KVO 實現原理

2021-08-04 23:55:49 字數 3379 閱讀 3981

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

六、改變dogage屬性,然後 步驟二的屬性觀察方法將會被執行,同時屬性改變的新值也傳遞過來了

列印結果

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...