s大家從網(wǎng)上的資料也可以查找出對KVC的描述逢捺。那我也就站在前人的基礎(chǔ)上做一個小小的偷懶癞季,復(fù)制一段網(wǎng)上的資料。
KVC運(yùn)用了一個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"];
就會被編譯器處理成:
SEL sel = sel_get_uid ("setValue:forKey:");
IMPmethod = objc_msg_lookup (site->isa,sel);
method(site, sel, @"sitename",@"name");
IPM注釋:
其實(shí)挺份,還有一種更加簡單的方法可以讓我們辦到相同的目的,運(yùn)用IMP指針优训,IMP就是Implementation的縮寫蚤吹,顧名思義,它是指向一個方法實(shí)現(xiàn)的指針躲因,每一個方法都有一個對應(yīng)的IMP,所以毛仪,我們可以直接調(diào)用方法的IMP指針芯勘,來避免方法調(diào)用死循環(huán)的問題。
看了上一段大家KVC有個初步的認(rèn)識衡怀,那下面就具體結(jié)合實(shí)際中應(yīng)用來進(jìn)行分析安疗。
在.h文件中的申明
下面是字典轉(zhuǎn)模型
以上代碼就是一個簡單字典轉(zhuǎn)模型的寫法荐类。在這里要注意的就.h里的屬性聲明名稱必須和字典里的Key保持一致,這是問什么了如果不一致的話就會報錯。我對KVC底層理解就從這句話開始的潘拨。
首先要考慮的就是我們在使用setValuesForKeysWithDictionary:這個方法饶号,這個方法的底層是調(diào)用setValue:forKey:,到了這里我們就一下子回到上面紅色的那一大部分茫船。(這里的Value和Key都可以通過字典轉(zhuǎn)數(shù)組在遍歷數(shù)組來獲取。
)但到了這一步問題還是沒有解決涩禀,那么我們就往下面走然眼。上面紅色部分為我們提供一個訪問路徑,告訴內(nèi)這塊是誰的(好比如一個標(biāo)記)它并沒有告述我們最想要的答案罪治。那在這里我只能做一個它的底層實(shí)現(xiàn)推測。
method(site,sel, @"sitename", @"name")雁社;到了這一步后我們的路徑已經(jīng)確定晒骇,我認(rèn)為他下邊有類似我們的set和get這樣的方法(這種想法是起源與屬性set和get方法的使用),這個方法的名稱就是key『name』洪囤,等等到了這里是我們是不是感覺這樣的東西很熟悉,那就是我們類中聲明的屬性也有這樣的方法喇完,這兩者類的isa相同的那它有必要建兩個嗎我認(rèn)為method(site,sel, @"sitename", @"name")剥啤;是會與屬性的set和get會產(chǎn)生一個連接。到了這里是不是思路打開了府怯。上面的報錯也可以解決了因?yàn)閗ey寫錯或字典中的數(shù)據(jù)過多的報錯都是沒有辦法取得關(guān)聯(lián)。