前言
集合的遍历操作是开发中最常见的操作之一,从C语言经典的for循环到利用多核cpu的优势进行遍历,开发中ios有若干集合遍历方法,本文通过研究和测试比较了各个操作方法的效率和优略势,并总结几个使用集合遍历时的小技巧。
想到循环遍历数组、字典这些常见的集合,大家脑子里第一反应就是for循环和快速遍历,并津津乐道的传承使用着这些方法,这些已经足够满足开发中所有类似的需求,似乎没有什么需要总结的,其实不然,不信往下看,知道的大神就不要浪费时间了。
第一种方式:for循环
Objective-C是基于C语言的,自然可以使用for循环
遍历数组:
NSArray *iosArray = @[@"L", @"O", @"V", @"E", @"I", @"O", @"S"];
for (int i = 0; i < iosArray.count; i++) {
//处理数组中数据
NSLog(@"%@", iosArray[i]);
}
遍历数组很简单没问题,下面遍历字典
遍历字典:
NSDictionary *dict = @{@"1":@"11", @"2":@"22", @"3":@"33"};
NSArray *keysArray = [dict allKeys];
for (int i = 0; i < keysArray.count; i++) {
//根据键值处理字典中的每一项
NSString *key = keysArray[i];
NSString *value = dict[key];
NSLog(@"%@", value);
}
我们知道字典和set是无序的,所以我们无法根据特定的整数下标来直接访问其中的值,于是需要先获取字典中的键或者set中的所有对象,这样就可以在获取到的有序数组上进行遍历了。然而创建数组是要额外的开销的,还会多创建出一个数组对象,他会保留collection中的所有对象,占用了内存。
总结优缺点:
优点:被广泛使用,容易接受,操作简单;
缺点:遍历字典和set是比较繁琐,会占用比较多的系统资源。
第二种方式:NSEnumerator
NSEnumerator是一个抽象基类,其中定义了2个方法,使其子类实现:
- (nullable ObjectType)nextObject;
@property (readonly, copy) NSArray*allObjects;
其中nextObject是关键方法,它返回枚举里的下一个对象。每次调用改方法其,其内部结构都会更新,使得下一次调用方法时能返回下一个对象。等到枚举中全部的对象都已经返回之后,在调用就会返回nil,表示达到了枚举的末端。
Foundation框架中的collection都实现了这种遍历方式,例如:
NSArray *iosArray = @[@"L", @"O", @"V", @"E", @"I", @"O", @"S"];
NSEnumerator *enumerator = [iosArray objectEnumerator];//正向遍历
NSEnumerator *enumerator = [iosArray reverseObjectEnumerator];//反向遍历
id object;
while ((object = [enumerator nextObject]) != nil) {
//处理枚举器中的数据
NSLog(@"%@", object);
}










