iOS-循環(huán)遍歷對比

for循環(huán)

for循環(huán)入門常用,可以正序、逆序查詢數(shù)據(jù)。

// for數(shù)組遍歷
for (int i = 0; i < self.traverseArray.count; i++) {
    NSLog(@"%@",self.traverseArray[I]);
}

// for字典遍歷
NSArray *dictionaryArray = [self.traverseDictionary allKeys];
for (int i = 0 ; i < dictionaryArray.count; i++) {
    NSLog(@"key = %@",dictionaryArray[I]);
}
for in 循環(huán)

for in 遍歷,又稱快速遍歷,與for循環(huán)區(qū)別就是看不到循環(huán)次數(shù)及索引情況。數(shù)組是有序的,for循環(huán)過程中也是有序的,for in遍歷過程中是根據(jù)數(shù)組中數(shù)據(jù)添加順序而定的,for in 不可逆序遍歷 !

for (NSString *str in self.traverseArray) {
    NSLog(@"%@",str);
}
枚舉器

枚舉器是一種蘋果官方推薦的更加面向?qū)ο蟮囊环N遍歷方式,相比于for循環(huán),它具有高度解耦、面向?qū)ο蟆⑹褂梅奖愕葍?yōu)勢

// 正序遍歷數(shù)組
[self.traverseArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    NSLog(@"正序%@",obj);
}];

// 逆序遍歷數(shù)組
[self.traverseArray enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    NSLog(@"逆序%@",obj);
}];

// 遍歷字典
#warning 字典是無序的不存在正序逆序
[self.traverseDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) {
    NSLog(@"key:%@->value%@",key,value);
}];
dispatch_apply函數(shù)

GCD dispatch_apply函數(shù)是一個同步調(diào)用,block任務(wù)執(zhí)行n次后才返回。該函數(shù)比較適合處理耗時較長、迭代次數(shù)較多的情況。

dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

dispatch_apply(self.traverseArray.count, queue, ^(size_t insex) {
               NSLog(@"%@",self.traverseArray[insex]);
               });
ReactiveCocoa 遍歷方法

ReactiveCocoa 中遍歷主要是針對元組RACTuple,對于數(shù)組、字典的遍歷都會包裝成RACTuple進行處理。
使用方法先集成ReactiveCocoa 點這里
集成方法有所改變
cocopods引入時 pod ‘ReactiveObjC’
項目引入中 #import "ReactiveObjC/ReactiveObjC.h"

// 數(shù)組遍歷
[self.traverseArray.rac_sequence.signal subscribeNext:^(id x) {
    NSLog(@"%@",x);
}];

// 字典遍歷 相當(dāng)于元組數(shù)據(jù)
[self.traverseDictionary.rac_sequence.signal subscribeNext:^(id x) {
    // 解包元組,會把元組的值,按順序給參數(shù)里面的變量賦值
    RACTupleUnpack(NSString *key,NSString*value) = x;
    NSLog(@"key=%@ value=%@",key,value);
}];

以上幾種遍歷方式 在100、10000、100000次遍歷所耗時長

耗時時間表

感謝文章分享:iOS循環(huán)遍歷 性能對比


附加:for循環(huán)刪除數(shù)組中的元素crash問題
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"2",@"3",@"4",@"9",@"4",@"12",@"22",@"4",@"4",@"5",@"6",@"1", nil];

for (NSString *str in array) {
    if ([str isEqualToString:@"4"]) {
        [array removeObject:str];
    }
}

運行后肯定會crash,原因是數(shù)組越界。這是為什么?當(dāng)我們正序快速遍歷時,如果刪除了一個,那么沒有遍歷到的元素位置都會往前移動一位,這樣系統(tǒng)就無法確定接下來遍歷是從刪除位置開始呢,還是從刪除位置下一位開始呢?這樣就造成程序crash了。但是我們想要遍歷刪除時要怎么做?解決這個問題的方法有好幾種。
1.采用for循環(huán)遍歷

for (int i = 0; i < array.count; i++) {
    NSString *str  = array[i];
    
    if ([str isEqualToString:@"4"]) {
        [array removeObject:str];
    }
}

2.定義一個副本,遍歷副本找到想要刪除的元素,然后在原數(shù)組中刪除對應(yīng)的元素。

NSMutableArray *copyArray = [NSMutableArray arrayWithArray:array];

for (NSString *str in copyArray) {
    if ([str isEqualToString:@"4"]) {
        [array removeObject:str];
    }
}

3.對數(shù)組逆序遍歷,查找對應(yīng)元素后刪除

NSEnumerator *enumerator = [array reverseObjectEnumerator];

for (NSString *str in enumerator) {
   if ([str isEqualToString:@"4"]) {
       [array removeObject:str];
   }
}

感謝文章分享:
for循環(huán)刪除數(shù)組中的元素crash問題
遍歷可變數(shù)組的同時刪除數(shù)組元素的幾種解決方案

最后編輯于
?著作權(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)容