iPhone程序開發 KVO/KVC實現機理分析
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 Coding(KVC)實現分析
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 Observing(KVO)實現
在上面所介紹的KVC機制上加上KVO的自動觀察消息通知機制就水到渠成了。
當觀察者為一個對象的屬性進行了注冊,被觀察對象的isa指針被修改的時候,isa指針就會指向一個中間類,而不是真實的類。所以isa指針其實不需要指向實例對象真實的類。所以我們的程序***不要依賴于isa指針。在調用類的方法的時候,***要明確對象實例的類名。
熟悉KVO的朋友都知道,只有當我們調用KVC去訪問key值的時候KVO才會起作用。所以肯定確定的是,KVO是基于KVC實現的。其實看了上面我們的分析以后,關系KVO的架構的構思也就水到渠成了。
因為KVC的實現機制,可以很容易看到某個KVC操作的Key,而后也很容易的跟觀察者注冊表中的Key進行匹對。假如訪問的Key是被觀察的Key,那么我們在內部就可以很容易的到觀察者注冊表中去找到觀察者對象,而后給他發送消息。
小結:iPhone程序開發 KVO/KVC實現機理分析的內容介紹完了,希望本文對你有所幫助。