iPhone程式開發 KVO/KVC實現機理分析是本文要介紹的內容,不多說,直接進入話題。我們來看詳細內容。
Objective-C裡面的Key-Value Observing (KVO)機制,非常不錯,可以很好的減少澆水代碼。關於KVO的學習,可以參考文章:《Key-Value Observing快速入門》:http://www.cocoadev.cn/Objective-C/Key-Value-Observing-Quick-Start-cn.asp
Key-Value CodingKVC)實現分析
KVC運用了一個isa-swizzling技術。isa-swizzling就是類型混合指標機制。KVC主要通過isa-swizzling,來實現其內部尋找定位的。isa指標,如其名稱所指,就是is a kind of的意思),指向維護分發表的對象的類。該分發表實際上包含了指向實作類別中的方法的指標,和其它資料。
比如說如下的一行KVC的代碼:
- [site setValue:@"sitename" forKey:@"name"];
就會被編譯器處理成:
- SEL sel = sel_get_uid ("setValue:forKey:");
- IMP method = objc_msg_lookup (site->isa,sel);
- method(site, sel, @"sitename", @"name");
首先介紹兩個基本概念:
1)SEL資料類型:它是編譯器運行Objective-C裡的方法的環境參數。
2)IMP資料類型:他其實就是一個 編譯器內部實現時候的函數指標。當Objective-C編譯器去處理實現一個方法的時候,就會指向一個IMP對象,這個對象是C語言表述的類型事實上,在Objective-C的編譯器處理的時候,基本上都是C語言的)。
關於如何找到實現函數的指標,可參考文章:《Objective-C如何避免動態綁定,而獲得方法地址》:http://www.cocoadev.cn/Objective-C/Get-method-address.asp
這下KVC內部的實現就很清楚的清楚了:一個對象在調用setValue的時候,1)首先根據方法名找到運行方法的時候所需要的環境參數。2)他會從自己isa指標結合環境參數,找到具體的方法實現的介面。3)再直接尋找得來的具體的方法實現。
Key-Value ObservingKVO)實現
在上面所介紹的KVC機制上加上KVO的自動觀察訊息通知機制就水到渠成了。
當觀察者為一個對象的屬性進行了註冊,被觀察對象的isa指標被修改的時候,isa指標就會指向一個中間類,而不是真實的類。所以isa指標其實不需要指向執行個體對象真實的類。所以我們的程式最好不要依賴於isa指標。在調用類的方法的時候,最好要明確對象執行個體的類名。
熟悉KVO的朋友都知道,只有當我們調用KVC去訪問key值的時候KVO才會起作用。所以肯定確定的是,KVO是基於KVC實現的。其實看了上面我們的分析以後,關係KVO的架構的構思也就水到渠成了。
因為KVC的實現機制,可以很容易看到某個KVC操作的Key,而後也很容易的跟觀察者註冊表中的Key進行匹對。假如訪問的Key是被觀察的Key,那麼我們在內部就可以很容易的到觀察者註冊表中去找到觀察者對象,而後給他發送訊息。
小結:iPhone程式開發 KVO/KVC實現機理分析的內容介紹完了,希望本文對你有所協助。