iOS底層系列:KVC

前言

今天我們簡單聊一下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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容