iOS循环遍历 性能对比(for 、forin、NSEnumerator.....)

本文探讨了在iOS开发中不同类型的循环遍历方式,包括for循环、forin循环、使用NSEnumerator以及使用GCD的dispatch_apply函数。其中,for循环适合正序或逆序查询数据,而GCD适用于处理耗时长、迭代次数多的任务。同时,文中还提及了ReactiveObjC框架在项目中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前段时间学习了NSEnumerator的遍历方法 感觉很好用 于是总结一下iOS生涯当中 所用到的遍历。好奇的简单了做了一个效率对比。没想到最NB的居然是它。
1、for循环

for循环不做过多介绍,入门常用、可以正序、逆序查询数据。也常用于创建九宫格。贴两行代码自己体会。

//for--数组遍历
 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]);
    }
2、forin 循环
forin 遍历 又称快速遍历  简单实用 比for 循环等级高些 与for循环最明显的区别就是看不到循环次数及索引情况。数组是有序的 for循环过程中也是有序的,forin遍历过程中是根据数组中数据添加顺序而定的。
 for (NSString *str in self.traverseArray) {
        
        NSLog(@"%@",str);
        
    }
forin 不可逆序遍历 !
3、枚举器
枚举器是一种苹果官方推荐的更加面向对象的一种遍历方式,相比于for循环,它具有高度解耦、面向对象、使用方便等优势
想深入了解的我给大家推荐几篇文章
//正序遍历数组
    [self.traverseArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {


        NSLog(@"正序%@",obj);


    }];
   //逆序遍历数组
    [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);
        
    }];
4、dispatch_apply函数

GCD dispatch_apply函数是一个同步调用,block任务执行n次后才返回。该函数比较适合处理耗时较长、迭代次数较多的情况。

  dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    dispatch_apply(self.traverseArray.count, queue, ^(size_t insex) {
      
         NSLog(@"%@",self.traverseArray[insex]);
      
   });

5、ReactiveCocoa 遍历方法
ReactiveCocoa 中遍历主要是针对元组RACTuple,对于数组、字典的遍历都会包装成RACTuple进行处理。
使用方法先集成ReactiveCocoa  点这里
集成方法有所改变
cocopods引入时  pod ‘ReactiveObjC’

项目引入中  #import "ReactiveObjC/ReactiveObjC.h"

//数组遍历
    [self.traverseArray.rac_sequence.signal subscribeNext:^(id x) {


        NSLog(@"%@",x);
    }];
//字典遍历 相当于元组数据
    [self.traverseDictionary.rac_sequence.signal subscribeNext:^(id x) {
        // 解包元组,会把元组的值,按顺序给参数里面的变量赋值
        RACTupleUnpack(NSString *key,NSString*value) = x;
        
        NSLog(@"key=%@ value=%@",key,value);
        
    }];
重点来了
终于说到重点了看一下以上几种遍历方式 在100、10000、100000次遍历所耗时长。



看图分析、自己领会。可以根据自己的需求使用不同的遍历方式!
Demo: https://github.com/DearWang/TraverseDemo
参考文档

https://github.com/ReactiveCocoa/ReactiveObjC

https://www.jianshu.com/p/5d4a8be9baf7


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值