iOS KVC賦值取值過程和異常處理

賦值過程:
  1. 先找相關(guān)方法:set<key>:,_set<key>:,setIs<key>:
  2. 若沒有相關(guān)方法則:+ (BOOL)accessInstanceVariablesDirectly判斷是否可以直接訪問成員變量
  3. 如果accessInstanceVariablesDirectly返回YES,繼續(xù)找相關(guān)成員變量_<key>,_is<key>,<key>,is<key>,如果沒找到則拋出異常setValue: forUndefinedKey:
  4. 如果accessInstanceVariablesDirectly返回NO,直接執(zhí)行KVC的setValue: forUndefinedKey:
取值過程:

1 .先找相關(guān)方法:get<key>:,<key>:
2 .若沒有相關(guān)方法則:+ (BOOL)accessInstanceVariablesDirectly判斷是否可以直接訪問成員變量
3 .如果accessInstanceVariablesDirectly返回YES,繼續(xù)找相關(guān)成員變量_<key>,_is<key>,<key>,is<key>,如果沒找到則拋出異常valueForUndefinedKey:
4 .如果accessInstanceVariablesDirectly返回NO,直接執(zhí)行KVC的valueForUndefinedKey:

賦值的時候要注意:

1:非對象類型的屬性,賦值的時候,值不可以為空,否則會爆報:setNilValueForKey錯誤,為了解決賦值為空的報錯,需要寫下setNilValueForKey方法,不至于崩潰

@implementation Person
//非對象類型,值不能為空
- (void)setNilValueForKey:(NSString *)key{
    NSLog(@"setNilValueForKey :%@",key);
}
@end

2:對不存在的屬性賦值會報錯:setValue:forUndefinedKey:

-(void)setValue:(id)value forUndefinedKey:(NSString *)key
{
    NSLog(@"%@不存在",key);
}
賦值前驗證值的合法性:
- (BOOL)validateValue:(inout id  _Nullable __autoreleasing *)ioValue error:(out NSError * _Nullable __autoreleasing *)outError{

validate<value>工作原理:
  1. 先找一下你的類中是否實現(xiàn)了方法validate<Value>:error:
  2. 如果實現(xiàn)了就會根據(jù)實現(xiàn)方法里面的自定義邏輯返回NO或者YES,如果沒有實現(xiàn)這個犯法,則系統(tǒng)默認(rèn)返回YES

比如我們設(shè)置人的年齡不能超過200歲,可以有如下判斷:

- (BOOL)validateAge:(inout id  _Nullable __autoreleasing *)ioValue error:(out NSError * _Nullable __autoreleasing *)outError{
    NSNumber *value = (NSNumber*)*ioValue;
    int age = [value intValue];
    if (age <= 0 || age >= 200) {
        return NO;
    }
    return YES;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末劝评,一起剝皮案震驚了整個濱河市距境,隨后出現(xiàn)的幾起案子阿宅,更是在濱河造成了極大的恐慌蟀架,老刑警劉巖踢步,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岩瘦,死亡現(xiàn)場離奇詭異扮休,居然都是意外死亡唇撬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門吩跋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寞射,“玉大人,你說我怎么就攤上這事锌钮∏盼拢” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵梁丘,是天一觀的道長侵浸。 經(jīng)常有香客問我,道長氛谜,這世上最難降的妖魔是什么掏觉? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮值漫,結(jié)果婚禮上履腋,老公的妹妹穿的比我還像新娘。我一直安慰自己惭嚣,他們只是感情好遵湖,可當(dāng)我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晚吞,像睡著了一般延旧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上槽地,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天迁沫,我揣著相機與錄音芦瘾,去河邊找鬼。 笑死集畅,一個胖子當(dāng)著我的面吹牛近弟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挺智,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼祷愉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赦颇?” 一聲冷哼從身側(cè)響起二鳄,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎媒怯,沒想到半個月后订讼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡扇苞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年欺殿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鳖敷。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡脖苏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出哄陶,到底是詐尸還是另有隱情帆阳,我是刑警寧澤哺壶,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布屋吨,位于F島的核電站,受9級特大地震影響山宾,放射性物質(zhì)發(fā)生泄漏至扰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一资锰、第九天 我趴在偏房一處隱蔽的房頂上張望敢课。 院中可真熱鬧,春花似錦绷杜、人聲如沸直秆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽圾结。三九已至,卻和暖如春齿诉,著一層夾襖步出監(jiān)牢的瞬間筝野,已是汗流浹背晌姚。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留歇竟,地道東北人挥唠。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像焕议,于是被迫代替她去往敵國和親宝磨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,630評論 2 359

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

  • KVC KVC定義 KVC(Key-value coding)鍵值編碼号坡,就是指iOS的開發(fā)中懊烤,可以允許開發(fā)者通過K...
    暮年古稀ZC閱讀 2,148評論 2 9
  • 源碼加翻譯 #import <Foundation/NSArray.h> #import <Foundation/...
    CAICAI0閱讀 1,159評論 0 50
  • KVC(Key-value coding)鍵值編碼,單看這個名字可能不太好理解宽堆。其實翻譯一下就很簡單了腌紧,就是指iO...
    我的夢工廠閱讀 891評論 1 8
  • KVC(Key-valuecoding)鍵值編碼,單看這個名字可能不太好理解畜隶。其實翻譯一下就很簡單了壁肋,就是指iOS...
    榕樹頭閱讀 715評論 0 2
  • 引言:這一陣子用到了Jenkins,于是寫一篇文檔記錄下過程籽慢。 1. 新建一個項目 2.項目配置 jenkins需...
    成橙鋮閱讀 615評論 0 2