前言
今天我們簡(jiǎn)單聊一下KVC疆栏,鍵值編碼多搀。
平時(shí)我們給屬性賦值或者取值都是使用點(diǎn)語(yǔ)法摧阅,調(diào)用屬性的set或者get方法帅掘,除此之外蘋果還為我們提供另一種方法委煤,使用key或者可以keyPath賦值或者取值。
//賦值
- (void)setValue:(nullable id)value forKey:(NSString *)key;
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
-
// 取值
- (nullable id)valueForKey:(NSString *)key;
- (nullable id)valueForKeyPath:(NSString *)keyPath;
具體使用咱就不提了修档,說(shuō)說(shuō)KVC底層具體的實(shí)現(xiàn)邏輯吧
賦值
當(dāng)我們調(diào)用了setValue:forKey:
的時(shí)候碧绞,比如我們執(zhí)行下面代碼
[person1 setValue:@10 forkey:@"age"];
系統(tǒng)會(huì)按照setAge:
,_setAge:
的順序吱窝,查找person類中是否實(shí)現(xiàn)了這些方法(其中之一即可)讥邻,如果找到了,則直接調(diào)用方法院峡,如果這兩個(gè)方法否沒(méi)有找到计维,下面就從Person類中查找+ (BOOL)accessInstanceVariablesDirectly
這個(gè)方法的返回值。
默認(rèn)該方法返回的是YES撕予,通過(guò)返回值控制是否允許直接給成員變量賦值鲫惶。因?yàn)橛行r(shí)候我們只是創(chuàng)建了一個(gè)成員變量,向下面代碼中這樣实抡,并沒(méi)有set方法欠母,所以就要看是否允許直接給成員變量設(shè)置值。
@interface Person : NSObject
{
@public
int _age;
}
@end
如果不允許直接給成員變量賦值吆寨,則直接拋出NSUnknownKeyException錯(cuò)誤赏淌。
如果是允許給成員變量直接設(shè)置值,則會(huì)按照_age, _isAge, age, isAge順便啄清,依次查找成員變量六水,查找到成員變量,直接賦值,如果找不到這幾個(gè)成員變量掷贾,拋出NSUnknownKeyException錯(cuò)誤睛榄。
這就是賦值的整個(gè)流程,蠻簡(jiǎn)單的想帅,可能就是這幾個(gè)順序容易混掉场靴。
取值
取值的流程跟賦值其實(shí)是一樣的,只是最開(kāi)始查找的取值方法是不一樣的港准,大家可以對(duì)照下圖看一下