iOS KVC內(nèi)部執(zhí)行順序

最近面試被虐的體無完膚,特意回來惡補(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 拋出異常的處理

一般重寫該方法即可

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

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

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