KVC的底層原理

1、基本getter的搜索模式

當(dāng)一個(gè)對(duì)象調(diào)用valueForKey:方法取值的時(shí)候,他的內(nèi)部執(zhí)行以下過(guò)程。

1.在實(shí)例中搜索找到具有名稱(chēng)的第一個(gè)訪問(wèn)器方法get<Key>,<key>,is<Key>,或者_(dá)<key>,按照這個(gè)順序。如果找到,則調(diào)用它并執(zhí)行步驟5。否則,請(qǐng)繼續(xù)下一步。

2.判斷是否是數(shù)組,如果是數(shù)組則對(duì)數(shù)組中的每個(gè)對(duì)象一次調(diào)用valueForKey:方法,并返回一個(gè)新的數(shù)組。否則就執(zhí)行步驟3。

3.判斷是否是NSSet,如果是集合則對(duì)集合中的每個(gè)對(duì)象一次調(diào)用valueForKey:方法,并返回一個(gè)新的集合。否則就執(zhí)行步驟4。

4.調(diào)用accessInstanceVariablesDirectly方法,判斷是否啟用實(shí)例變量的查找,默認(rèn)是YES,也就是啟用,當(dāng)返回為YES時(shí),將按照這個(gè)_<key>, _is<Key>, <key>, or is<Key>,來(lái)一次查找。我們可以通過(guò)重寫(xiě)這個(gè)方法來(lái)禁用實(shí)例變量的查找。

5.如果檢索到的屬性值是對(duì)象指針,則只需返回結(jié)果。如果該值是NSNumber支持的標(biāo)量類(lèi)型,則將其存儲(chǔ)在NSNumber實(shí)例中并返回它。如果結(jié)果是NSNumber不支持的標(biāo)量類(lèi)型,請(qǐng)轉(zhuǎn)換為NSValue對(duì)象并返回該對(duì)象。

6.如果所有的方法均失敗,則調(diào)用valueForUndefinedKey:。 默認(rèn)情況下,這會(huì)拋出一個(gè)異常,但是NSObject的子類(lèi)可以通過(guò)重寫(xiě)這個(gè)方法,來(lái)定制一些特性的功能。

2、基本setter的搜索模式

setValue:forKey:的默認(rèn)實(shí)現(xiàn)(給定鍵和值參數(shù)作為輸入),嘗試將名為key的屬性設(shè)置為value,在使用這個(gè)方法設(shè)置值時(shí),對(duì)象的內(nèi)部會(huì)經(jīng)歷以下流程。

1.按該順序查找名為set <Key>:或_set <Key>的第一個(gè)訪問(wèn)器。 如果找到,請(qǐng)使用輸入值調(diào)用它并完成。

2.如果沒(méi)有找到setter訪問(wèn)器,并且類(lèi)方法accessInstanceVariablesDirectly返回YES,則按該順序查找名稱(chēng)類(lèi)似于_ <key>,_ is <Key>,<key>或is <Key>的實(shí)例變量。 如果找到,直接用輸入值設(shè)置變量并完成操作。

3.在找不到訪問(wèn)器或?qū)嵗兞亢?,調(diào)用setValue:forUndefinedKey:。 默認(rèn)情況下,這會(huì)拋出一個(gè)異常,但是NSObject的子類(lèi)可以通過(guò)重寫(xiě)這個(gè)方法來(lái)提供特定的操作。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Kvc簡(jiǎn)介: KVC(Key-value coding)鍵值編碼,顧名思義。額,簡(jiǎn)單來(lái)說(shuō),是可以通過(guò)對(duì)象屬性名稱(chēng)(...
    梁煒東閱讀 982評(píng)論 0 4
  • 成員變量&屬性變量&實(shí)例變量的區(qū)別 說(shuō)明: 屬性在LLVM編譯的作用下會(huì)自動(dòng)生成setter和getter方法; ...
    我是晶鍋閱讀 280評(píng)論 0 0
  • 源碼加翻譯 #import <Foundation/NSArray.h> #import <Foundation/...
    CAICAI0閱讀 1,233評(píng)論 0 50
  • KVC(Key-valuecoding)鍵值編碼,單看這個(gè)名字可能不太好理解。其實(shí)翻譯一下就很簡(jiǎn)單了,就是指iOS...
    榕樹(shù)頭閱讀 772評(píng)論 0 2
  • 什么是KVC? KVC的全稱(chēng)叫Key-Value Coding,也叫做鍵值編碼,在apple官方文檔中是這么解釋的...
    Joker_King閱讀 802評(píng)論 0 3

友情鏈接更多精彩內(nèi)容