知其所以然 主題3 論觀察者模式之KVC和KVO

2022-07-04 19:09:15 字數 1657 閱讀 8868

在開發的時候,是不是忽然有種錯覺:我們好像是**的搬運工,乙個專案開始,把自己寫好的、封裝好的類、框架亦或別人寫好的第三方框架不假思索的運用到專案中,一方面:專案時間緊;二方面:簡單好用,減少了**量。但是有時候,我們是否應該停下腳步, 從底層去看看**的世界,那樣我們收益會頗豐,讓我們一起走在學習的路上吧!

(一) kvc的實現與運用

kvc 的底層實現是運用了 isa-swizzling 技術,也就是型別混合指標機制。通過 isa-swizzling,能夠來實現其內部查詢定位的。isa 指標,就是 is a kind of 的意思,指向系統維護分發表的物件的類。該分發表實際上包含了指向實現類中的方法的指標和其它資料物件。

比如下面的這句**:

1 [account  setvalue:@"

useraccount

" forkey:@"

account"];

23經過kvc內部編譯後,其內部實現如下:

45 sel sel = sel_get_uid("

setvalue:forkey:");

6 imp method = objc_msg_lookup (account->isa,sel);

7 method(account,sel,@"

useraccount

",@"

account

");

我們就可以分析得出:

sel是一種資料型別,是編譯器執行objective-c裡的方法的環境引數。

imp也是一種資料型別,說白了就是編譯器內部實現時候的函式指標。也就是說:當編譯器去處理實現乙個方法的時候,就會指向乙個imp物件,這個物件是c語言表述的型別。  

kvc在呼叫方法setvalue的時候,會依照以下步驟執行:

a)根據方法名找到執行方法的時候所需要的環境引數;

b) 結合isa指標,找到具體的方法實現的介面;

c) 對查詢的方法進行具體的實現

所以,kvc的運作流程就是:當乙個物件註冊了乙個觀察者,被觀察物件的isa指標被修改的時候,isa指標就會指向乙個中間類,而不是真實的類。比如說:我們在運用kvc進行字典和模型之間轉化時,要完全一致物件例項的類名,就是這個道理。

(二)kvo的實現和運用

kvo是指當指定的物件的屬性被修改了,讓要進行事件處理的物件及時接收到通知的一種實現機制。

1

定義:2 [self addobserver:self forkeypath:@"

code

" options:0

context:str];3實現

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

在運用kvo的時候,當有屬性發生改變時,會提供自動的訊息通知。這樣我們在開發的時候就不需要去具體實現(運用**、block),如每次屬性改變了就傳送訊息通知。我們不需要設計自己的觀察者模型,直接可以在專案裡進行使用,十分快捷和方便。

此外,kvo 的架構非常的強大,有框架支援,可以很容易的支援多個觀察者觀察同乙個屬性,以及相關的值。

具體的例項會在稍後發表,讓我們在案例中進一步體會這兩種觀察者模式的運用和實現。

知其然知其所以然

深深的話我們淺淺地說,長長的路我們慢慢地走。讓我們始終有勇氣特立獨行。不溫不火,不疾不徐。將記憶自拔於困頓的泥沼,將希望播撒於每一寸光陰!生活縱有千千結,還是要繼續下去,時光就是如此的公平。最近總是陷入乙個又乙個的糾結,乙個又乙個的心塞。生活彷彿陷入了恍若隔世的噩夢中,而自己就是噩夢中的小丑一樣,只...

java結果輸出,知其所以然

輸出結果是什麼?為什麼會出現這種結果?一public class parenttest static public class childrentest extends parenttest static public static void main string args 二 true or f...

知其所以然 劉未鵬

這是乙個樹狀的知識結構,越往上層走,需要記憶的節點就越少。所謂觸類旁通者,其實便是因為他擅長去理解解法背後的更具一般性的東西。所以我還有乙個習慣,就是看到美妙的證明和解法總是會去一遍又一遍的去反覆揣摩,試圖理解想出這個證明的人到底是怎麼想出來的,有沒有什麼一般性的方法可循,很多時候,在這樣揣摩的過程...