KVC簡單理解

2021-07-15 18:50:06 字數 2108 閱讀 1079

1.kvc到底是個啥?

kvc(nskeyvaluecoding)是一種非正式協議,key-value coding是一種機制間接訪問物件的屬性,使用字串識別屬性,而不是通過呼叫乙個訪問器方法或直接訪問例項變數。

2.kvc原理

key就是乙個字串來表示特定屬性,通常對應乙個訪問器方法或者接收物件的例項變數。key必須使用ascii編碼,以小寫字母開頭,不包含空格。

key path其實就是指定例項變數的key,一般使用點方法操作(address.street)。

依據keys 和 key paths 提供的訪問物件屬性的方法:

- (void

)setvalue:(

nullable

id)value forkey:(

nsstring

*)key;

- (nullable

id)valueforkey:(

nsstring

*)key;

- (void

)setvalue:(

nullable

id)value forkeypath:(

nsstring

*)keypath;

- (nullable

id)valueforkeypath:(

nsstring

*)keypath;

根據key(key path)獲取值,valueforkey:(valueforkeypath:),如果沒有訪問器或例項變數,傳送乙個valueforundefinedkey:訊息,如果沒有實現,預設的valueforundefinedkey:會丟擲nsundefinedkeyexception異常

根據key(key path)設定值,

setvalue:forkey:

(setvalue:forkeypath:),如果key不存在,傳送乙個setvalue:forundefinedkey:訊息,如果沒有實現,預設的

valueforundefinedkey:會丟擲nsundefinedkeyexception異常

3.kvv鍵值驗證(

key-value validation)

kvv提供乙個驗證方法,格式為validate:error:,如果有乙個屬性位name,則實現為- (bool)validatename:(id *)iovalue error:(nserror * __autoreleasing *)outerror;。

kvv提供- (

bool

)validatevalue:(

inout

id__nullable

*__nonnull

)iovalue forkey:(

nsstring

*)inkey error:(

outnserror

**)outerror方法,使用此方法再分別呼叫指定屬性的驗證方法。

在使用驗證方法的時候,可以根據自己的需求定製驗證的條件。驗證方法不會自動呼叫,根據需求需要自己實現並主動呼叫。

4.kvc的實現

kvc運用了isa-swizzling技術。

isa-swizzling就是型別混合指標機制

。kvc主要通過isa-swizzling來實現其內部定位查詢

。isa指標(is a kind of),指向維護分發表的物件的類。該分發表實際上包含了指向實現類中的指標和其他資料。

當執行的時候就會被編譯成:

sel sel = sel_get_uid("setvalue:forkey:");

imp method = objc_msg_lookup(dic->isa,sel);

method(dic,sel,@"value",@"key");

其中,sel_get_uid函式是通過方法名得到乙個方法選擇器。

objc_msg_lookup:如果我們想用oc執行函式得到乙個imp,就可以使用objc_msg_lookup函式 。

這樣kvc內部實現就可以這樣描述了:

乙個物件在呼叫setvalue的時候,

1、根據方法名找到執行方法的時候所需要的環境引數。

2、他會從自己isa指標結合環境引數,找到具體的方法實現介面。

3、再直接查詢得到的具體的方法實現。

鍵值編碼 KVC 簡單的KVC

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

KVC簡單介紹

例項化乙個老師 teacher t1 teacher alloc init kvc工作流程 kvc首先檢車類中是否有getter,setter方法.如果沒有就去找有沒有和key相同名字的例項變數.如果也公尺有,就去找有沒有和 key相同名字的例項變數.第乙個方法是用來設定值的 t1 setvalue...

KVO和KVC的對比理解

kvc 與 kvo 是 objective c 的關鍵概念,個人認為必須理解的東西,下面是例項講解。乙個物件擁有某些屬性。比如說,乙個 person 物件有乙個 name 和乙個 address 屬性。以 kvc 說法,person 物件分別有乙個 value 對應他的 name 和 address...