iOS 模擬KVO的底層實現 手動實現KVO

2021-07-15 07:46:38 字數 1716 閱讀 8496

一、回顧系統的kvo是怎麼實現監聽的

#1. 例項化乙個類

person *person = [[person alloc] init];

person.age = 11;

#2. 開始監聽

[person addobserver:self forkeypath:@"age" options:nskeyvalueobservingoptionnew context:nil];

#3. 值改變時(age = 111),監聽執行的方法

-(void)observevalueforkeypath:(nsstring *)keypath ofobject:(id)object change:(nsdictionary

*)change context:(void *)context

我們既然要手動寫乙個kvo,那麼就要自己寫乙個api,讓person調嘍,還有乙個就是值發生變化,也會調乙個我們自己的api嘍,例如:ml_observer,具體請看下面

二、手動做咱們自己的kvo

核心步驟如下:

一)、生成乙個person類的派生類 person_kvo。

二)、使當前物件的isa指向新的派生類,就會呼叫派生類的set方法。

三)、重寫person_kvo的setage方法,在set方法中拿到觀察者(使用執行時關聯觀察者這個屬性)。

四)、每次重寫setage方法,都呼叫觀察者的ml_observevalueforkeypath方法。實現時刻監聽。

**如下:

viewcontroller.h

person *person = [[person alloc] init];

_person = person;

#呼叫手寫kvo開始監聽方法

[person ml_addobserver:self forkeypath:@"age" options:nskeyvalueobservingoptionnew context:nil];

# 監聽方法 (驗證手寫kvo是否成功)

- (void)ml_observevalueforkeypath:(nsstring *)keypath ofobject:(id)object change:(nsdictionary

*)change context:(void *)context

nsobject+kvo.h

- (void)ml_addobserver:(nsobject *)observer forkeypath:(nsstring *)keypath options:(nskeyvalueobservingoptions)options context:(void *)context
person_kvo.h

-(void)setage:(int)age
ps:該**僅僅是模擬kvo的底層實現流程,主要注重流程,具體的什麼引數如觀察新值、舊值,沒有做,有強迫症的朋友有興趣可以設定個列舉即可!

三、流程圖

手動實現kvo流程圖

iOS 底層實現 KVO

kvo是基於觀察者設計模式來實現的。觀察者模式 乙個目標物件管理所有依賴於它的觀察者物件,並在它自身的狀態改變時主動通知觀察者物件。這個主動通知通常是通過呼叫各觀察者物件所提供的介面方法來實現的。觀察者模式較完美地將目標物件與觀察者物件解耦。手動實現鍵值觀察 示例 被觀察的物件target 重寫se...

KVO底層實現原理

kvo是實現cocoa bindings的基礎,它提供了一種方法,當某個屬性改變時,相對的objects會被通知到。在其他語言中,這種觀察者模式通常需要單獨實現,而在objective c中,通常無須增加額外 即可使用,這是怎麼實現的呢?其實就是通過oc強大的執行時 runtime 實現的。當你第一...

手動設定例項變數的KVO實現監聽

手動設定例項變數的kvo實現監聽 如果將乙個物件設定成屬性,這個屬性是自動支援kvo的,如果這個物件是乙個例項變數,那麼,這個kvo是需要我們自己來實現的.以下給出原始碼供君測試 student.h 與 student.m supernotification import inte ce stude...