在開發的時候,是不是忽然有種錯覺:我們好像是**的搬運工,乙個專案開始,把自己寫好的、封裝好的類、框架亦或別人寫好的第三方框架不假思索的運用到專案中,一方面:專案時間緊;二方面:簡單好用,減少了**量。但是有時候,我們是否應該停下腳步, 從底層去看看**的世界,那樣我們收益會頗豐,讓我們一起走在學習的路上吧!
(一) 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...
知其所以然 劉未鵬
這是乙個樹狀的知識結構,越往上層走,需要記憶的節點就越少。所謂觸類旁通者,其實便是因為他擅長去理解解法背後的更具一般性的東西。所以我還有乙個習慣,就是看到美妙的證明和解法總是會去一遍又一遍的去反覆揣摩,試圖理解想出這個證明的人到底是怎麼想出來的,有沒有什麼一般性的方法可循,很多時候,在這樣揣摩的過程...