最近面試被虐的體無完膚,特意回來惡補(bǔ)了一些基礎(chǔ)的知識。
KVC (Key-value coding)鍵值編碼,指的是在iOS開發(fā)中,開發(fā)者可以通過Key名直接訪問對象的屬性,或者給對象的屬性賦值,而不需要調(diào)用明確的存取方法,這樣就可以在運(yùn)行的時候動態(tài)的訪問和修改對象的屬性,而不是在編譯時確定,也這是iOS開發(fā)中的黑魔法之一,很多高級的iOS開發(fā)技巧都是基于KVC。
上面說的是關(guān)于KVC的基本定義。下面說一下kvc實(shí)際中的執(zhí)行方法。
當(dāng)調(diào)用setvalue: forKey時 底層調(diào)用順序如下:
①優(yōu)先調(diào)用set<key>方法 如果有該方法 在setter 方法中完成設(shè)置
②當(dāng)五set方法時,kvc機(jī)制會檢查+(bool)accessInstanceVariablesDirectly;是否返回YES。當(dāng)你重寫了該方法并且返回的時No時 kvc機(jī)制會直接執(zhí)行setValue:forUndefinedKey:啊這樣做可以讓你的類不被別人使用kvc;
③一般情況開發(fā)者不會重寫+(bool)accessInstanceVariablesDirectly方法 所以kvc 會搜索有沒有名稱為_<key>的成員變量。無論是在.h還是在.m部分定義也無論是使用了什么訪問修飾符只要存在_成員變量都可以對其成員變量進(jìn)行賦值。
④如果該類中沒有set,也沒有_成員變量,kvc機(jī)制會搜索_is<key>成員變量。
⑤如果該類還是沒有_ 也沒有_is kvc 會繼續(xù)搜索<key>,is<key>再給它們賦值。
⑥如果都不存在 系統(tǒng)將會執(zhí)行setValue:forUndefinedKey 拋出異常。
對于setValue:forUndefinedKey 拋出異常的處理
一般重寫該方法即可