iPhone程序開發(fā) KVO/KVC實(shí)現(xiàn)機(jī)理分析
iPhone程序開發(fā) KVO/KVC實(shí)現(xiàn)機(jī)理分析是本文要介紹的內(nèi)容,不多說,直接進(jìn)入話題。我們來看詳細(xì)內(nèi)容。
Objective-C里面的Key-Value Observing (KVO)機(jī)制,非常不錯(cuò),可以很好的減少澆水代碼。關(guān)于KVO的學(xué)習(xí),可以參考文章:《Key-Value Observing快速入門》:http://www.cocoadev.cn/Objective-C/Key-Value-Observing-Quick-Start-cn.asp
Key-Value Coding(KVC)實(shí)現(xiàn)分析
KVC運(yùn)用了一個(gè)isa-swizzling技術(shù)。isa-swizzling就是類型混合指針機(jī)制。KVC主要通過isa-swizzling,來實(shí)現(xiàn)其內(nèi)部查找定位的。isa指針,如其名稱所指,(就是is a kind of的意思),指向維護(hù)分發(fā)表的對象的類。該分發(fā)表實(shí)際上包含了指向?qū)崿F(xiàn)類中的方法的指針,和其它數(shù)據(jù)。
比如說如下的一行KVC的代碼:
- [site setValue:@"sitename" forKey:@"name"];
就會(huì)被編譯器處理成:
- SEL sel = sel_get_uid ("setValue:forKey:");
- IMP method = objc_msg_lookup (site->isa,sel);
- method(site, sel, @"sitename", @"name");
首先介紹兩個(gè)基本概念:
(1)SEL數(shù)據(jù)類型:它是編譯器運(yùn)行Objective-C里的方法的環(huán)境參數(shù)。
(2)IMP數(shù)據(jù)類型:他其實(shí)就是一個(gè) 編譯器內(nèi)部實(shí)現(xiàn)時(shí)候的函數(shù)指針。當(dāng)Objective-C編譯器去處理實(shí)現(xiàn)一個(gè)方法的時(shí)候,就會(huì)指向一個(gè)IMP對象,這個(gè)對象是C語言表述的類型(事實(shí)上,在Objective-C的編譯器處理的時(shí)候,基本上都是C語言的)。
關(guān)于如何找到實(shí)現(xiàn)函數(shù)的指針,可參考文章:《Objective-C如何避免動(dòng)態(tài)綁定,而獲得方法地址》:http://www.cocoadev.cn/Objective-C/Get-method-address.asp
這下KVC內(nèi)部的實(shí)現(xiàn)就很清楚的清楚了:一個(gè)對象在調(diào)用setValue的時(shí)候,(1)首先根據(jù)方法名找到運(yùn)行方法的時(shí)候所需要的環(huán)境參數(shù)。(2)他會(huì)從自己isa指針結(jié)合環(huán)境參數(shù),找到具體的方法實(shí)現(xiàn)的接口。(3)再直接查找得來的具體的方法實(shí)現(xiàn)。
Key-Value Observing(KVO)實(shí)現(xiàn)
在上面所介紹的KVC機(jī)制上加上KVO的自動(dòng)觀察消息通知機(jī)制就水到渠成了。
當(dāng)觀察者為一個(gè)對象的屬性進(jìn)行了注冊,被觀察對象的isa指針被修改的時(shí)候,isa指針就會(huì)指向一個(gè)中間類,而不是真實(shí)的類。所以isa指針其實(shí)不需要指向?qū)嵗龑ο笳鎸?shí)的類。所以我們的程序***不要依賴于isa指針。在調(diào)用類的方法的時(shí)候,***要明確對象實(shí)例的類名。
熟悉KVO的朋友都知道,只有當(dāng)我們調(diào)用KVC去訪問key值的時(shí)候KVO才會(huì)起作用。所以肯定確定的是,KVO是基于KVC實(shí)現(xiàn)的。其實(shí)看了上面我們的分析以后,關(guān)系KVO的架構(gòu)的構(gòu)思也就水到渠成了。
因?yàn)?strong>KVC的實(shí)現(xiàn)機(jī)制,可以很容易看到某個(gè)KVC操作的Key,而后也很容易的跟觀察者注冊表中的Key進(jìn)行匹對。假如訪問的Key是被觀察的Key,那么我們在內(nèi)部就可以很容易的到觀察者注冊表中去找到觀察者對象,而后給他發(fā)送消息。
小結(jié):iPhone程序開發(fā) KVO/KVC實(shí)現(xiàn)機(jī)理分析的內(nèi)容介紹完了,希望本文對你有所幫助。