KVC的底層分析

2021-10-22 03:42:55 字數 2474 閱讀 9485

首先丟擲最常見的關於kvc的兩個面試題:

這篇文章就是圍繞這2個問題來闡述的,相信你看完了一定會對這兩個問題有乙個深刻的了解.

kvc(key-value coding)鍵值編碼,就是指ios的開發中,可以允許開發者通過key名直接訪問物件的屬性,或者給物件的屬性賦值。而不需要呼叫明確的訪問方法。這樣就可以在執行時動態地訪問和修改物件的屬性。而不是在編譯時確定,這也是ios開發中的黑魔法之一。很多高階的ios開發技巧都是基於kvc實現的。

下面是kvc最為重要的四個方法:

如果你想獲得當前類的屬性,你就用valueforkey和key,如果你想賦值複雜的比如上面說的cat中的weight,那你必須要用valueforkeypath和keypath來獲取和操作,這個都是比較簡單的,簡單回顧一下.接下來進入正題

我門先用一張圖來說明setvalue:forkey:的原理(圖可能不夠清晰哈,沒關係,會一步一步證明)

一、首先會去查詢setkey:,_setkey方法,找到方法直接賦值,找不到進行下一步;

我們先在gdperson寫出這2個方法,看看是不是執行到裡面了(注意:.h方法不寫屬性,因為屬性直接會生成set、get方法),我們直接在.m中寫出這2個方法)

從上面的截圖很容易看出來,先找setkey,找到直接賦值,找不到就找_setkey,找到直接賦值,找不到就崩潰,直接報nsunknownkeyexception,找不到這個key吧!

二、執行+(bool)accessinstancevariablesdirectly

這個方法是告訴程式到底有沒有這個key,預設是yes,就是有這個key,所以我們如果返回no,直接程式就會報錯吧!這個比較簡單,大家可以直接複製**驗證一下就行,如果返回的是yes就會進入下一步.

+(bool)accessinstancevariablesdirectly{

returnno;

三、接著按照_key、_iskey、key、iskey找賦值

我們先寫四個成員變數如下:

這裡可以看出優先順序就是_age、_isage、age、isage(大家可以把int_age;去掉就能試出第二個,依次類推就行)

如果這4個都找不到就會直接報nsunknownkeyexception,找到了就直接賦值

這就是kvc賦值的整個過程,同樣的-(void)setvalue:(nullable id)value forkey:(nsstring*)key;賦值的過程也是類似如此,大家可以試一下,用我上面的方法去嘗試,這也就知道這道面試題怎麼解答了,上面那張圖就是答案,相信大家這麼回答,面試官應該是非常滿意了!

請看下面的**,我們先用**驗證結果,再說過程

從上面的截圖,很容易看出來,無論是forkey還是forkeypath都是觸發了kvo

這裡我可以告訴大家是因為,用kvc賦值的時候,會呼叫到

從之前kvo的學習我們知道,呼叫-(void)willchangevalueforkey:(nsstring *)key、-(void)didchangevalueforkey:(nsstring *)key就會觸發kvo,這下就很清楚,為什麼說kvc能觸發kvo了吧

接下來部落格我會介紹ios類別(category)的底層知識.

KVC和KVO底層原理

kvc和kvo想必都熟知的乙個名詞,觀察者模式,而kvo是基於kvc的,那麼kvc到底是個什麼,kvo又是什麼,那麼它們之間是怎麼關聯的。當你了解kvc機制,會恍然大悟,只要知道乙個ui的結構,就能對他做任意的修改。而kvo是觀察者模式的一種實現,對物件屬性監聽能達到乙個高效能處理,所以了解kvc和...

MCV中字典轉模型的KVC底層實現

instancetype initwithdictionary nsdictionary dict return self 遍歷字典裡面所有的key和值,name,icon enumeratekeysandobjectsusingblock 遍歷字典中的所有keys和valus dict enume...

鍵值編碼 KVC 簡單的KVC

main.m kvc一 created by goddog on 15 1 3.1.我們可以通過setter和getter方法來設定和修改物件的屬性,同時也可以通過鍵值編碼 kvc 來操作物件屬性。2.何為kvc 以字串的形式間接的操作物件的屬性。設定值用 setvalue 屬性值 forkey 屬...