KVO KVC 實現機理分析

2021-06-10 00:48:46 字數 1380 閱讀 6236

**請註明轉之 蘋果開發中文網(

以上說明是本文不可分割的一部分。

objective-c裡面的key-value observing (kvo)機制,非常不錯,可以很好的減少澆水**。關於kvo的學習,可以參考文章:《key-value observing快速入門》:  

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如何避免動態繫結,而獲得方法位址》:

這下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實現機理分析

iphone 程式開發kvo kvc實現機理分析是本文要介紹的內容,不多說,直接進入話題。我們來看詳細內容。objective c裡面的key value observing kvo 機制,非常不錯,可以很好的減少澆水 關於kvo的學習,可以參考文章 key value observing快速入門 ...

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

iphone程式開發 kvo kvc實現機理分析是本文要介紹的內容,不多說,直接進入話題。我們來看詳細內容。objective c裡面的key value observing kvo 機制,非常不錯,可以很好的減少澆水 關於kvo的學習,可以參考文章 key value observing快速入門 ...

SEAndroid實現機理

seandroid是google在android 4.4上正式推出的一套以selinux為基礎於核心的系統安全機制。而selinux則是由美國nsa 國安局 和一些公司 redhat tresys 設計的乙個針對linux的安全加強系統。nsa最初設計的安全模型叫flask,全稱為flux adva...