iPhone程式開發 KVO/KVC實現機理分析

來源:互聯網
上載者:User

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的代碼:

 
  1. [site setValue:@"sitename" forKey:@"name"]; 

就會被編譯器處理成:

 
  1. SEL sel = sel_get_uid ("setValue:forKey:");  
  2. IMP method = objc_msg_lookup (site->isa,sel);  
  3. 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實現機理分析的內容介紹完了,希望本文對你有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.