深入理解 KVC KVO 實現機制 KVC

2022-07-07 14:36:16 字數 1560 閱讀 5801

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

kvc概述

kvc使用

kvc鍵值查詢

搜尋單值成員

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

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

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

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的時候進行了如下操作:

深入理解 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 實現機制 KVO

kvc和kvo都屬於鍵值程式設計而且底層實現機制都是isa swizzing,所以本來想放在一起講的。但是篇幅有限所以就分成了兩篇博文。kvc實現機制傳送門 kvo概述 鍵值觀察key value observer就是觀察者模式。當需要檢測其他類的屬性值變化,但又不想被觀察的類知道,有點像fbi監視...