KVC設值過程

在KVC的實現(xiàn)中秽澳,依賴setter和getter的方法實現(xiàn),所以方法命名應該符合蘋果要求的規(guī)范,否則會導致KVC失敗滥崩。

setValue的過程

先看一個很有趣的問題


@interface ViewController ()

@property (nonatomic, strong) NSString *Str;
@property (nonatomic, strong) NSString *str;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    
    // 情況1
    self.Str = @"大寫";
    self.str = @"小寫";
    
    NSLog(@"str:%@----Str:%@",_str,_Str);
    
    // 輸出  str:(null)----Str:小寫
    
    // 情況2
//    self.Str = @"大寫";
    self.str = @"小寫";

    NSLog(@"str:%@----Str:%@",_str,_Str);
    
    // 輸出  str:(null)----Str:小寫
    
    
    // 情況3
    self.Str = @"大寫";
//    self.str = @"小寫";
    
    NSLog(@"str:%@----Str:%@",_str,_Str);
    
    // 輸出   str:(null)----Str:大寫
}

輸出:(null)----123

也就是說据忘,當有同名大小寫屬性時鹦牛,遵守駝峰標識的屬性會失效,也就是小寫開頭的屬性

為什么小寫開頭的屬性會失效呢勇吊?曼追??

我們從setter方法找起

我們會發(fā)現(xiàn)ocsetter方法是遵守駝峰標識的汉规,比如setStr:(NSString *)Str

所以我的猜想:既然是setStr礼殊。。针史。晶伦。。那么有_Str的實例變量就優(yōu)先給他賦值啄枕,沒有就給_str賦值

我們嘗試下

[self setValue:@"大寫" forKey:@"Str"];
[self setValue:@"小寫" forKey:@"str"];

結果還是一樣

回歸主題婚陪,我們調(diào)用[self setValue:@"大寫" forKey:@"Str"];這個的時候,會先調(diào)用這個屬性的set方法.

那么問題也來了频祝,如果這時候的key是沒有的屬性或者nil泌参,那么就會導致調(diào)用setKey的時候脆淹,找不到方法導致崩潰

所以,我們可以封裝類似醬紫的安全方法

- (void)safeSetValue:(NSString *)value forKey:(NSString *)key
{
    if (![key isKindOfClass:[NSString class]])
    {
        return;
    }
    
    @try {
        [self setValue:value forKey:key];
    }@catch(NSException *exception){}@finally {}
}

沒有找到setKey:方法的時候

KVC機制會檢查
+ (BOOL)accessInstanceVariablesDirectly方法有沒有返回YES沽一,默認該方法會返回YES盖溺,如果你重寫了該方法讓其返回NO的話,那么在這一步KVC會執(zhí)行setValue:forUNdefinedKey:方法

一般我們不會閑得蛋疼去重寫+ (BOOL)accessInstanceVariablesDirectly方法锯玛,

所以這時候既然setKey:方法找不到了咐柜,就只能硬干了,直接去找對應的成員變量賦值攘残,

所以說拙友,就算是只讀屬性(只讀屬性沒有set方法),這時候用kvc也可以賦值歼郭,因為找不到set方法遗契,直接對成員變量賦值

那如果找不到成員變量呢?病曾?牍蜂?

如果都沒有找到,那么就只能調(diào)用valueforUndefinedKeysetValue:forUNdefinedKey:(沒有定義這個key)拋異常

應用

提一個問題:+ (BOOL)accessInstanceVariablesDirectly

什么時候重寫這個方法泰涂,返回NO

但我們重寫這個方法鲫竞,返回NO的時候,外部對這個類進行kvc的時候逼蒙,就沒那么容易了从绘,因為當找不到set方法,就直接失敗了嘛

所以你想要這個類是牢,足夠封閉僵井,安全的時候,可以重寫這個方法驳棱,尤其是設置SDK的時候使用

字典轉模型

服務端返回字段批什,有可能是id,或者其他oc的系統(tǒng)保留字段

那么就可以重寫這方法社搅,在這塊地方去統(tǒng)一處理


- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
    
}

valueForKey:搜索過程

有點多驻债,復雜

這個文章講得不錯

Tips

如果valueForKeyPath:方法的調(diào)用者是數(shù)組,那么就是去訪問數(shù)組元素的屬性值

應用:模型轉字典

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罚渐,一起剝皮案震驚了整個濱河市却汉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌荷并,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件青扔,死亡現(xiàn)場離奇詭異源织,居然都是意外死亡翩伪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門谈息,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缘屹,“玉大人,你說我怎么就攤上這事侠仇∏嶙耍” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵逻炊,是天一觀的道長互亮。 經(jīng)常有香客問我,道長余素,這世上最難降的妖魔是什么豹休? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮桨吊,結果婚禮上威根,老公的妹妹穿的比我還像新娘。我一直安慰自己视乐,他們只是感情好洛搀,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著佑淀,像睡著了一般留美。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上渣聚,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天独榴,我揣著相機與錄音,去河邊找鬼奕枝。 笑死棺榔,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的隘道。 我是一名探鬼主播症歇,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谭梗!你這毒婦竟也來了忘晤?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤激捏,失蹤者是張志新(化名)和其女友劉穎设塔,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體远舅,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡闰蛔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年痕钢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片序六。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡任连,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出例诀,到底是詐尸還是另有隱情随抠,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布繁涂,位于F島的核電站拱她,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏爆土。R本人自食惡果不足惜椭懊,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望步势。 院中可真熱鬧氧猬,春花似錦、人聲如沸坏瘩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倔矾。三九已至妄均,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哪自,已是汗流浹背丰包。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留壤巷,地道東北人邑彪。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像胧华,于是被迫代替她去往敵國和親寄症。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • KVC(Key-valuecoding)鍵值編碼矩动,單看這個名字可能不太好理解有巧。其實翻譯一下就很簡單了,就是指iOS...
    榕樹頭閱讀 713評論 0 2
  • KVC是Key Value Coding的簡稱悲没。它是一種可以通過字符串的名字(key)來訪問類屬性的機制篮迎。而不是通...
    _李恒閱讀 747評論 0 0
  • KVC是Key Value Coding的簡稱。它是一種可以通過字符串的名字(key)來訪問類屬性的機制。而不是通...
    153037c65b0c閱讀 11,474評論 15 17
  • 前言:往往會某項工具WORK柑潦,就想究其原理享言。本文先簡單介紹KVC 一峻凫、KVC 簡介 1.1 KVC 概述 1.KV...
    夢蕊dream閱讀 917評論 0 2
  • 什么是KVC渗鬼? KVC(Key-value coding)鍵值編碼,單看這個名字可能不太好理解荧琼。其實是指iOS的開...
    薩繆閱讀 4,640評論 1 13