前言
今天我們簡單聊一下KVC,鍵值編碼。
平時我們給屬性賦值或者取值都是使用點語法,調(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;
具體使用咱就不提了,說說KVC底層具體的實現(xiàn)邏輯吧
賦值

kvc_1.png
當(dāng)我們調(diào)用了setValue:forKey:的時候,比如我們執(zhí)行下面代碼
[person1 setValue:@10 forkey:@"age"];
系統(tǒng)會按照setAge:,_setAge:的順序,查找person類中是否實現(xiàn)了這些方法(其中之一即可),如果找到了,則直接調(diào)用方法,如果這兩個方法否沒有找到,下面就從Person類中查找+ (BOOL)accessInstanceVariablesDirectly這個方法的返回值。
默認該方法返回的是YES,通過返回值控制是否允許直接給成員變量賦值。因為有些時候我們只是創(chuàng)建了一個成員變量,向下面代碼中這樣,并沒有set方法,所以就要看是否允許直接給成員變量設(shè)置值。
@interface Person : NSObject
{
@public
int _age;
}
@end
如果不允許直接給成員變量賦值,則直接拋出NSUnknownKeyException錯誤。
如果是允許給成員變量直接設(shè)置值,則會按照_age, _isAge, age, isAge順便,依次查找成員變量,查找到成員變量,直接賦值,如果找不到這幾個成員變量,拋出NSUnknownKeyException錯誤。
這就是賦值的整個流程,蠻簡單的,可能就是這幾個順序容易混掉。
取值
取值的流程跟賦值其實是一樣的,只是最開始查找的取值方法是不一樣的,大家可以對照下圖看一下

kvc_2.png