for in练链、經(jīng)典for循環(huán)和EnumerateObjectsUsingBlock

一直以為for循環(huán)和 for in 是一樣的,例如:

CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();

NSMutableArray * arr = @[@1,@2,@3,@4,@5].mutableCopy;

for (NSNumber *obj in arr) {

????NSLog(@"%@",obj);

}

CFAbsoluteTime end = CFAbsoluteTimeGetCurrent();

NSLog(@"for in cost: %0.3f",end - start);

CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();

for (int i = 0; i < arr.count; i ++) {

????NSLog(@"%@",arr[i]);

}

CFAbsoluteTime endTime = CFAbsoluteTimeGetCurrent();

NSLog(@"for cost: %0.3f",endTime - startTime);

但是偶然間寫(xiě)了這么一段就崩潰了

for (NSString * obj in arr) {

????if ([obj integerValue] == 2) {

????????[arr addObject:@"6"];

????}

}

CFAbsoluteTime end = CFAbsoluteTimeGetCurrent();

NSLog(@"for in cost: %0.3f Arr:%@",end - start,arr);

但是如果寫(xiě)成for循環(huán)就沒(méi)有問(wèn)題,然后就去百度了一下發(fā)現(xiàn):如果在for in 循環(huán)里畏纲,對(duì)這個(gè)數(shù)組進(jìn)行了修改的話稚晚,無(wú)論是增远搪,刪裤纹,修改數(shù)組元素位置永毅,都會(huì)扔一個(gè)異常出來(lái)把跨,枚舉的過(guò)程中數(shù)組發(fā)生了突變(<__NSArrayM: 0xa4fc000> was mutated while being enumerated.)

for in實(shí)際上是快速枚舉,跟for循環(huán)意義上還是有區(qū)別的沼死。NSArray的枚舉操作中有一條需要注意:對(duì)于可變數(shù)組進(jìn)行枚舉操作時(shí)着逐,不能通過(guò)添加或刪除對(duì)象等這類操作來(lái)改變數(shù)組容器,否則就會(huì)報(bào)錯(cuò).而本身這種操作也是有問(wèn)題的,數(shù)組容器已經(jīng)改變意蛀,可能遍歷到?jīng)]有分配的位置耸别,用for循環(huán)機(jī)器不能自己察覺(jué),但是枚舉器可以察覺(jué)县钥。

enumerateKeysAndObjectsUsingBlock用法

NSDictionary * dic = [NSDictionary dictionaryWithObjectsAndKeys:@"obj1",@"key1",@"obj2",@"key2", nil];

[dic enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) {

????NSLog(@"value for key %@ is %@ ", key, value);

????if ([@"key2" isEqualToString:key]) {

????????????*stop = YES;

????}}];

NSDictionary有一個(gè)方法叫enumerateKeysAndObjectsUsingBlock太雨,它就一個(gè)參數(shù)就是block,這個(gè)block攜帶了三個(gè)參數(shù)魁蒜,這將要把dictionary里面的key和value每次一組傳遞到block囊扳,enumerateKeysAndObjectsUsingBlock會(huì)遍歷dictionary并把里面所有的key和value一組一組的展示給你吩翻,每組都會(huì)執(zhí)行這個(gè)block。這其實(shí)就是傳遞一個(gè)block到另一個(gè)方法锥咸,在這個(gè)例子里它會(huì)帶著特定參數(shù)被反復(fù)調(diào)用狭瞎,直到找到一個(gè)key2的key,然后就會(huì)通過(guò)重新賦值那個(gè)BOOL *stop來(lái)停止運(yùn)行搏予,停止遍歷同時(shí)停止調(diào)用block熊锭。

更詳細(xì)的用法 (http://blog.itpub.net/12231606/viewspace-1084119/)

enumerateObjectsWithOptions使用

NSArray *array = [[NSArray alloc]initWithObjects:@"a",@"b",@"c",@"d",@"e",@"f", nil];

//遍歷數(shù)組元素

[array enumerateObjectsUsingBlock:^(id? _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

NSLog(@"obj=%@? idx=%ld",obj,idx);

}];

//如果指定了NSEnumerationConcurrent順序,那么底層通過(guò)GCD來(lái)處理并發(fā)執(zhí)行事宜雪侥,具體實(shí)現(xiàn)可能會(huì)用到dispatch group碗殷。也就是說(shuō),這個(gè)會(huì)用多線程來(lái)并發(fā)實(shí)現(xiàn)速缨,并不保證按照順序執(zhí)行

//NSEnumerationReverse 倒序排列

[array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id obj, NSUInteger idx, BOOL * _Nonnull stop) {

????????NSLog(@"idx=%ld, id=%@", idx, obj);

????????//當(dāng)需要結(jié)束循環(huán)的時(shí)候,調(diào)用stop,賦予YES

????if (idx ==3) {

????????*stop = YES;

}}];

//NSIndexSet類代表一個(gè)不可變的獨(dú)特的無(wú)符號(hào)整數(shù)的集合,稱為索引,因?yàn)槭褂盟鼈兊姆绞叫科蕖_@個(gè)集合被稱為索引集? ? 唯一的,有序的旬牲,無(wú)符號(hào)整數(shù)的集合

[NSIndexSet indexSetWithIndex:1];//創(chuàng)建一個(gè)索引集合仿粹,根據(jù)索引值

[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0,8)];//創(chuàng)建一個(gè)索引集合,根據(jù)一個(gè)NSRange對(duì)象

[array enumerateObjectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0,3)] options:NSEnumerationReverse usingBlock:^(id? _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

????????NSLog(@"\n\n\nidx=%ld, id=%@", idx, obj);

}];

for in原茅、經(jīng)典for循環(huán)和EnumerateObjectsUsingBlock 的比較

對(duì)于集合中對(duì)象數(shù)很多的情況下吭历,for in 的遍歷速度非常之快,但小規(guī)模的遍歷并不明顯(還沒(méi)普通for循環(huán)快)

Value查詢index的時(shí)候, 面對(duì)大量的數(shù)組推薦使用enumerateObjectsWithOptions的并行方法.

遍歷字典類型的時(shí)候, 推薦使用enumerateKeysAndObjectsUsingBlock,block版本的字典遍歷可以同時(shí)取key和value(forin只能取key再手動(dòng)取value)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末擂橘,一起剝皮案震驚了整個(gè)濱河市晌区,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌通贞,老刑警劉巖朗若,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異滑频,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)唤冈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門峡迷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人你虹,你說(shuō)我怎么就攤上這事绘搞。” “怎么了傅物?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵夯辖,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我董饰,道長(zhǎng)蒿褂,這世上最難降的妖魔是什么圆米? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮啄栓,結(jié)果婚禮上娄帖,老公的妹妹穿的比我還像新娘。我一直安慰自己昙楚,他們只是感情好近速,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著堪旧,像睡著了一般削葱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淳梦,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天析砸,我揣著相機(jī)與錄音,去河邊找鬼谭跨。 笑死干厚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的螃宙。 我是一名探鬼主播蛮瞄,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼谆扎!你這毒婦竟也來(lái)了挂捅?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤堂湖,失蹤者是張志新(化名)和其女友劉穎闲先,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體无蜂,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伺糠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了斥季。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片训桶。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖酣倾,靈堂內(nèi)的尸體忽然破棺而出舵揭,到底是詐尸還是另有隱情,我是刑警寧澤躁锡,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布午绳,位于F島的核電站,受9級(jí)特大地震影響映之,放射性物質(zhì)發(fā)生泄漏拦焚。R本人自食惡果不足惜蜡坊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望耕漱。 院中可真熱鬧算色,春花似錦、人聲如沸螟够。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)妓笙。三九已至若河,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寞宫,已是汗流浹背萧福。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辈赋,地道東北人鲫忍。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像钥屈,于是被迫代替她去往敵國(guó)和親悟民。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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