蘋果的kvo原理通過isa-swizzling
技術實現,本質實現邏輯是在runtime時新增乙個子類,重寫set方法進行操作,現在我們也基於runtime來實現乙個kvo。
首先新建乙個person類,繼承自nsobject,新增乙個name屬性。
然後給nsobject新增乙個分類kvo,在分類中實現kvo的註冊方法ez_addobserver:forkeypath: options:context:,這個方法的作用和系統的註冊方法一樣。先為person動態新增乙個子類ezkvo_person,然後為其新增乙個setname方法,因為我們要監聽的是那麼的變化。
- (void)ez_addobserver:(nsobject *)observer forkeypath:(nsstring *)keypath options:(nskeyvalueobservingoptions)options context:(void *)context
上面的是註冊方法,下面處理的是在更改name屬性值的時候,通過重寫的set方法,將訊息發出給觀察者讓其收到鍵值變化。過程是先取出被觀察者,然後傳送訊息(即observevalueforkeypath:ofobject:change:context:)讓觀察者接收。當然,也可以邏輯嚴謹些像系統那樣向父類逐層呼叫,這裡就不寫出來了。
void setname(id self, sel _cmd, idname)
最後沿用前面兩篇文章的方法,在vc裡新增觸控事件改變name的值,並在訊息接收方法裡列印資訊(方便測試,就用了keypath來代替change儲存鍵值)。
- (void)touchesbegan:(nsset*)touches withevent:(uievent *)event
訊息接收
- (void)observevalueforkeypath:(nsstring *)keypath ofobject:(id)object change:(nsdictionaryid> *)change context:(void *)context
結果:2018-07-22 23:29:49.085057+0800 kvodemo[4402:212515] name屬性的改變為小明
KVO的簡單使用
kvo key value observing 主要用於檢視 資料互動,比如介面中相關資料發生了變化,介面的顯示也要跟著變化,這時候就需要 kvo 建立介面和資料之間的連線。1.使用場景一 stockobj.h import inte ce stockobj nsobject property no...
MBProgressHUD 使用的KVO分析
pragma mark kvo 註冊kvo被觀察者需要被觀察的屬性,新增傳值給被觀察者出來方法的傳值選項,傳新值還是舊值,還是兩個都傳。void registerforkvo 移除kvo被觀察者需要被觀察的屬性 void unregisterfromkvo 生成kvo需要被觀察者需要被觀察的屬性陣列...
swift中KVO的使用
nsobject基類中預設遵守了nskeyvaluecoding協議,所以我們在使用kvo的時候必須是基於nsobject才能正常使用。在使用oc開發的時候由於我們在建立的類缺省會繼承nsobject所以可以直接使用kvo,但是在swift中我們必須手動顯示的繼承nsobject類,並且還需要新增 ...