KVC的實現機制

2021-07-10 08:48:13 字數 2030 閱讀 8405

kvc和kvo都屬於鍵值程式設計而且底層實現機制都是isa-swizzing,所以本來想放在一起講的。但是篇幅有限所以就分成了兩篇博文 kvo實現機制傳送門

kvc概述

kvc是key value coding的簡稱。它是一種可以通過字串的名字(key)來訪問類屬性的機制。而不是通過呼叫setter、getter方法訪問。

關鍵方法定義在 nskeyvaluecodingprotocol

kvc支援類物件和內建基本資料型別。

kvc使用

獲取值valueforkey: 傳入nsstring屬性的名字。

valueforkeypath: 屬性的路徑,xx.xx

valueforundefinedkey 預設實現是丟擲異常,可重寫這個函式做錯誤處理

修改值setvalue:forkey:

setvalue:forkeypath:

setvalue:forunderfinedkey:

setnilvalueforkey: 對非類物件屬性設定nil時呼叫,預設丟擲異常。

kvc鍵值查詢

搜尋單值成員

setvalue:forkey:搜尋方式

1、首先搜尋setkey:方法。(key指成員變數名,首字母大寫)

2、上面的setter方法沒找到,如果類方法accessinstancevariablesdirectly返回yes。那麼按 _key,_iskey,key,iskey的順序搜尋成員名。(nskeyvaluecodingcatogery中實現的類方法,預設實現為返回yes)

3、如果沒有找到成員變數,呼叫setvalue:forunderfinedkey:

valueforkey:的搜尋方式

1、首先按getkey,key,iskey的順序查詢getter方法,找到直接呼叫。如果是bool、int等內建值型別,會做nsnumber的轉換。

2、上面的getter沒找到,查詢countofkey、objectinkeyatindex、keyatindexes格式的方法。如果countofkey和另外兩個方法中的乙個找到,那麼就會返回乙個可以響應nsarray所有方法的**集合的nsarray訊息方法。

3、還沒找到,查詢countofkey、enumeratorofkey、memberofkey格式的方法。如果這三個方法都找到,那麼就返回乙個可以響應nsset所有方法的**集合。

4、還是沒找到,如果類方法accessinstancevariablesdirectly返回yes。那麼按 _key,_iskey,key,iskey的順序搜尋成員名。

5、再沒找到,呼叫valueforundefinedkey。

kvc實現分析

kvc運用了isa-swizzing技術。isa-swizzing就是型別混合指標機制。kvc通過isa-swizzing實現其內部查詢定位。isa指標(is kind of 的意思)指向維護分發表的物件的類,該分發表實際上包含了指向實現類中的方法的指標和其他資料。

比如說如下的一行kvc**:

[site setvalue:@"sitename" forkey:@"name"];

//會被編譯器處理成

sel sel = sel_get_uid(setvalue:forkey);

imp method = objc_msg_loopup(site->isa,sel);

method(site,sel,@"sitename",@"name");

每個類都有一張方法表,是乙個hash表,值是還書指標imp,sel的名稱就是查表時所用的鍵。

sel資料型別:查詢方法表時所用的鍵。定義成char*,實質上可以理解成int值。

imp資料型別:他其實就是乙個編譯器內部實現時候的函式指標。當objective-c編譯器去處理實現乙個方法的時候,就會指向乙個imp物件,這個物件是c語言表述的型別。

kvc的內部機制:

乙個物件在呼叫setvalue的時候進行了如下操作:

(1)根據方法名找到執行方法的時候需要的環境引數

(2)他會從自己的isa指標結合環境引數,找到具體的方法實現介面。

(3)再直接查詢得來的具體的實現方法

深入理解 KVC KVO 實現機制 KVC

kvc和kvo都屬於鍵值程式設計而且底層實現機制都是isa swizzing,所以本來想放在一起講的。但是篇幅有限所以就分成了兩篇博文 kvo實現機制傳送門 kvc概述 kvc使用 kvc鍵值查詢 搜尋單值成員 kvc實現分析 kvc運用了isa swizzing技術。isa swizzing就是型...

深入理解 KVC KVO 實現機制 KVC

深入理解 kvc kvo 實現機制 kvc kvc和kvo都屬於鍵值程式設計而且底層實現機制都是isa swizzing,所以本來想放在一起講的。但是篇幅有限所以就分成了兩篇博文kvo實現機制傳送門 kvc概述 kvc使用 kvc鍵值查詢 搜尋單值成員 kvc實現分析 kvc運用了isa swizz...

深入理解 KVC KVO 實現機制 KVC

kvc和kvo都屬於鍵值程式設計而且底層實現機制都是isa swizzing,所以本來想放在一起講的。但是篇幅有限所以就分成了兩篇博文 kvo實現機制傳送門 kvc概述 kvc使用 kvc鍵值查詢 搜尋單值成員1 首先搜尋setkey 方法。key指成員變數名,首字母大寫 2 上面的setter方法...