一、定義
KVC(key value coding)是通過(guò)key或路徑在運(yùn)行時(shí)(runtime)動(dòng)態(tài)的直接操作(讀/寫(xiě))對(duì)象的屬性或?qū)嵗兞?,與存取方法的編譯時(shí)調(diào)用不同,是iOS動(dòng)態(tài)特性的黑魔法之一。KVC需要由類(lèi)別(Category) NSKeyValueCoding來(lái)支持。KVC兼容nil,無(wú)論key還是value都可以為nil,不會(huì)引起程序的崩潰,但非nil的key必須是合法的。
二、應(yīng)用場(chǎng)景
1、需要向系統(tǒng)或是已有模塊注入代碼模塊時(shí),比如核心動(dòng)畫(huà)的注冊(cè)、xib元素與代碼的關(guān)聯(lián)。
2、在做系統(tǒng)架構(gòu)時(shí),對(duì)于需要?jiǎng)討B(tài)地或是在不定場(chǎng)景中嵌入代碼塊進(jìn)入框架時(shí);
3、對(duì)類(lèi)的私有屬性或?qū)嵗兞窟M(jìn)行操作(訪(fǎng)問(wèn)/修改)。(注:還有另一種解決方案就是使用runtime機(jī)制)
三、底層原理探析
1、用不明確的方法對(duì)屬性進(jìn)行 存取操作
valueForKey:
1、總體規(guī)則:先找相關(guān)方法,如果找不到,則判斷accessInstanceVariablesDirectly(在NSKeyValueCoding.h文件中的屬性)的值,默認(rèn)是YES,再找相關(guān)變量,如果設(shè)置為NO(可以用來(lái)防止外部訪(fǎng)問(wèn)及操作),則系統(tǒng)會(huì)拋出異常,執(zhí)行KVC的valueForUndefinedKey,導(dǎo)致程序crash,解決方案是重寫(xiě)該方法。
2、相關(guān)方法:get<Key>, <key>
3、容器方法:
(1)、數(shù)組(NSArray):countOf<Key>和objectIn<Key>AtIndex;
(2)、集合(NSSet)
accessInstanceVariablesDirectly YES
4、相關(guān)變量:_<key>, _is<Key>, key, is<Key>
5、將基本類(lèi)型轉(zhuǎn)換成NSNumber;
6、隱藏方法:count、max、min、 sum、avg,使用的時(shí)候需要使用@,如:@count;
四、總結(jié)
在完全不知某個(gè)類(lèi)的屬性或成員變量,可以使用runtime中的C方法獲取,class_copyPropertyList, property_getName, class_copyIvarList, ivar_getName,然后再結(jié)合KVC機(jī)制,對(duì)類(lèi)中私有的屬性訪(fǎng)問(wèn)和修改。