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...