kvc,簡(jiǎn)單的說(shuō)就是用字符串動(dòng)態(tài)的去操作一個(gè)對(duì)象。通俗的講就是鍵值編碼。
它的幾個(gè)方法如下:
賦值:
- (void)setValue:(nullable id)value forKey:(NSString *)key;
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
?解釋:第一個(gè)參數(shù)傳入想賦的值,第二個(gè)參數(shù)傳入想接收值的屬性? ?
-(void)setValuesForKeysWithDictionary:(NSDictionary*)keyedValues;
取值:
- (nullable id)valueForKey:(NSString *)key;
- (nullable id)valueForKeyPath:(NSString *)keyPath;
?解釋:參數(shù)是傳入你想取值的屬性名
根源:
OC中任何對(duì)象都直接或間接的繼承自NSObject,而在Foundation框架中,NSObject有個(gè)叫“NSKeyValueCoding”的分類,里面就包含了上面所有這些KVC方法。因此任何對(duì)象都可以通過(guò)KVC來(lái)取值和賦值。 ??就利用了動(dòng)態(tài)地修改 isa 指針的值的技術(shù)
kvc賦值取值的注意點(diǎn):
1.? ? KVC中,賦值時(shí)傳入的值都只能是對(duì)象類型,無(wú)法直接傳入基本數(shù)據(jù)類型。
2. ??通過(guò)KVC取值時(shí),所有的返回值類型都是id類型(也即對(duì)象類型),因此無(wú)法直接用基本數(shù)據(jù)類型的變量來(lái)接收,必須調(diào)用其對(duì)應(yīng)的類型轉(zhuǎn)換代碼先進(jìn)行類型轉(zhuǎn)換
3.KVC中所有的屬性名都要以字符串的形式傳入
kvc的優(yōu)點(diǎn)
可以直接訪問(wèn)私有成員變量。
可以簡(jiǎn)化字典轉(zhuǎn)模型代碼。
for( id key in dic){
【p setValue:dic[key] ?forkey:key】;
}
或者:【p setValuesForKeysWithDictionary:dic】;
KVC疑問(wèn)解密
1.? ? 用KVC取值或賦值時(shí),會(huì)優(yōu)先找這個(gè)屬性對(duì)應(yīng)的getter或setter方法來(lái)對(duì)這個(gè)屬性賦值
2.? ? 如果找不到,則會(huì)查找?guī)聞澗€的屬性,如果找到則賦值
3.? ? 如果依然找不到,則會(huì)查找不帶下劃線的屬性,如果找到則賦值
4.? ? 如果還是找不到,則報(bào)錯(cuò)
5.復(fù)合路徑:
?setValue:屬性值 forKeyPath:屬性路徑 valueForKeyPath:屬性名
如果需要操作訪問(wèn)一些“屬性里的屬性”時(shí),就用帶Path的方法來(lái)操作。
6.重寫setValue:值? ?forUndefinedKey:鍵方法,可以預(yù)防性編程。