iOS KVC探索

成員變量雾棺、實例變量、屬性

代碼一.png
  • 成員變量:不會自動生成get衬浑、set方法捌浩,成員變量不能用點語法調(diào)用,因為沒有set和get方法工秩,只能使用->調(diào)用尸饺。
  • 屬性:屬性會自動生成set和get方法,可以使用.語法
  • 實例變量:是一種特殊的成員變量助币,通過class 聲明的成員變量

kvc基礎(chǔ)使用

@interface QHPerson : NSObject
@property (nonatomic,strong)NSString *name;
@property (nonatomic,strong)QHSon *son;
@end

@interface QHSon : NSObject
@property (nonatomic,strong)NSString *nickName;
@end

QHPerson *p = [QHPerson new];
[p setValue:@"qinhan" forKey:@"name"];
NSString *name = [p valueForKey:@"name"];
QHSon *son = [QHSon new];
[p setValue:son forKeyPath:@"son"];
[p setValue:@"sonName" forKeyPath:@"son.nickName"];
NSString *sonName = [p valueForKeyPath:@"son.nickName"];

如果是要多級訪問或讀取

- (nullable id)valueForKeyPath:(NSString *)keyPath;
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;

kvc賦值過程

我們先來看一下官網(wǎng)的描述

官網(wǎng)描述1.png

1.先查找set<Key>,_set<Key>兩個方法浪听,如果這兩個方法都沒有實現(xiàn),執(zhí)行步驟2
2.查找accessInstanceVariablesDirectly眉菱,默認(rèn)為YES迹栓,如果為NO,并且1中的方法也沒實現(xiàn)俭缓,則會閃退克伊。
3.如果accessInstanceVariablesDirectly為YES.則會按照_<Key>,_is<Key>,<key>,<isKey>的順序給成員變量賦值,如果這4個變量名都沒找到华坦,則走4的流程
4.如果上面的變量都沒有愿吹,則會走setValue:forUndefinedKey:,如果這個方法也沒有實現(xiàn)惜姐,則會出現(xiàn)異常閃退犁跪。我們可以通過這個方法來實現(xiàn)最后的異常處理,防止閃退

kvc取值過程

kvc文檔
相比于賦值,取值過程流程相對更加復(fù)雜一點
1.先按照get<Key>,<key>, is<Key>, or _<key>的順序取值
2.如果第一步的方法都沒有找到耘拇,則會按照countOf<Key>撵颊,objectIn<Key>AtIndexobjectIn<Key>AtIndex惫叛,<key> AtIndexes去找

  • 如果找到了其中一個,則會創(chuàng)建一個響應(yīng)所有NSArray方法的集合代理對象逞刷,并返回該對象嘉涌。如果沒有則會執(zhí)行下一步
    -這些方法通過對應(yīng)的.countarray[index]夸浅、objectsAtIndexes仑最,objectAtIndex訪問到,前提是必須要實現(xiàn)對應(yīng)的方法帆喇,否則會閃退
    3.如果2都沒有實現(xiàn)警医,查找名為countOf<Key>enumeratorOf<Key>memberOf<Key>這三個方法(對應(yīng)于NSSet類定義的原始方法)
    4.如果3都沒有找到坯钦,則會調(diào)用accessInstanceVariablesDirectly预皇,如果為YES,會按照順序取值婉刀,都沒有就會閃退吟温。如果為NO,就會跳到6
    5.判斷取出的屬性值突颊,如果為是對象就會直接返回鲁豪,如果不是會轉(zhuǎn)成NSNumber返回
  1. valueForUndefinedKey,如果走到這一步?jīng)]有實現(xiàn)這個方法律秃,則會異常爬橡,所以當(dāng)我們自定義kvc的時候,最好實現(xiàn)這個方法

下面附上nsarray代碼

@interface QHArray ()
@property (nonatomic,readwrite,assign) NSUInteger count;

@end

@implementation QHArray

//-(void)incrementCount{
//    NSLog(@"%s",__func__);
//    self.count ++;
//}
-(NSUInteger)countOfNumbers{
    NSLog(@"%s",__func__);
    return self.count;
}

-(id)objectInNumbersAtIndex:(NSUInteger)index{
    //當(dāng)key使用numbers時棒动,KVC會找到這兩個方法糙申。
    NSLog(@"%s",__func__);
    return @(index * 2);
}

- (NSArray *)numbersAtIndexes:(NSIndexSet *)indexes
{
    NSLog(@"%s",__func__);
    return @[@"1",@"2"];
}


-(NSInteger)getNum{
    NSLog(@"%s",__func__);//第一個,自己一個一個注釋試
    return 10;
}
-(NSInteger)num{
    NSLog(@"%s",__func__);//第二個
    return 11;
}
-(NSInteger)isNum{
    NSLog(@"%s",__func__);//第三個
    return 12;
}

//實現(xiàn)
    QHArray *arr = [QHArray new];
    
    NSNumber* num =   [arr valueForKey:@"num"];
           NSLog(@"%@",num);
    id ar = [arr valueForKey:@"numbers"];
    
    NSLog(@"ar:%@",ar);
    NSLog(@"0:%@  1:%@",ar[0],ar[1]);
    
    NSIndexSet *sets = [NSIndexSet indexSetWithIndex:1];
    
    NSLog(@"sets:%@", [ar objectsAtIndexes:sets]);

kvc應(yīng)用場景

1.動態(tài)的賦值和取值
setValue:forKey:valueForKey:還有路由setValue:forKeyPath:迁客,valueForKeyPath:
2.多值操作(model和字典互轉(zhuǎn))
結(jié)合runtime郭宝,獲取成員變量的值,可以實現(xiàn)model和字典轉(zhuǎn)換
3.用KVC實現(xiàn)高階消息傳遞

//KVC實現(xiàn)高階消息傳遞
- (void)transmitMsg{
    NSArray *arrStr = @[@"english", @"franch", @"chinese"];
    NSArray *arrCapStr = [arrStr valueForKey:@"capitalizedString"];
    
    for (NSString *str in arrCapStr) {
        NSLog(@"%@", str);
    }
    NSArray *arrCapStrLength = [arrCapStr valueForKeyPath:@"capitalizedString.length"];
    for (NSNumber *length in arrCapStrLength) {
        NSLog(@"%ld", (long)length.integerValue);
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掷漱,一起剝皮案震驚了整個濱河市粘室,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卜范,老刑警劉巖衔统,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡锦爵,警方通過查閱死者的電腦和手機(jī)舱殿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來险掀,“玉大人沪袭,你說我怎么就攤上這事≌燎猓” “怎么了冈绊?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長埠啃。 經(jīng)常有香客問我死宣,道長,這世上最難降的妖魔是什么碴开? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任毅该,我火速辦了婚禮,結(jié)果婚禮上潦牛,老公的妹妹穿的比我還像新娘眶掌。我一直安慰自己,他們只是感情好罢绽,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布畏线。 她就那樣靜靜地躺著,像睡著了一般良价。 火紅的嫁衣襯著肌膚如雪寝殴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天明垢,我揣著相機(jī)與錄音蚣常,去河邊找鬼。 笑死痊银,一個胖子當(dāng)著我的面吹牛抵蚊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播溯革,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼贞绳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了致稀?” 一聲冷哼從身側(cè)響起冈闭,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抖单,沒想到半個月后萎攒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遇八,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年耍休,在試婚紗的時候發(fā)現(xiàn)自己被綠了刃永。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡羊精,死狀恐怖斯够,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情园匹,我是刑警寧澤雳刺,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站裸违,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏本昏。R本人自食惡果不足惜供汛,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涌穆。 院中可真熱鬧怔昨,春花似錦、人聲如沸宿稀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祝沸。三九已至矮烹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間罩锐,已是汗流浹背奉狈。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留涩惑,地道東北人仁期。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像竭恬,于是被迫代替她去往敵國和親跛蛋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

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