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)提供特定的操作。