经典for循环 稳定
for in (NSFastEnumeration) 适合大规模遍历,不适合小规模遍历
makeObjectsPerformSelector 大规模遍历还行,没for in牛
kvc集合运算符 不适合做大规模遍历
enumerateObjectsUsingBlock 不优势不劣势
enumerateObjectsWithOptions(NSEnumerationConcurrent) 利用多核cpu优势在执行任务方面遍历很快
dispatch_apply 利用多核cpu优势在执行任务方面遍历很快
NSArray和NSOrderedSet都支持使用reverseObjectEnumerator倒序遍历,如:
- NSArray *strings = @[@"1", @"2", @"3"];
- for (NSString *string in [strings reverseObjectEnumerator]) {
- NSLog(@"%@", string);
- }
这个方法只在循环第一次被调用,所以也不必担心循环每次计算的问题。
同时,使用enumerateObjectsWithOptions:NSEnumerationReverse也可以实现倒序遍历:
- [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id *sark, NSUInteger idx, BOOL *stop) {
- [sark doSomething];
- }];
对于耗时且顺序无关的遍历,使用并发版本
- [array enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id *sark, NSUInteger idx, BOOL *stop) {
- [sark doSomethingSlow];
- }];
//用块遍历,,imageName:取的数组里每个对象,其实是id类型的,idx:索引, stop:bool类型应该是是否完成。
[array enumerateObjectsUsingBlock:^(NSString * imageName, NSUInteger idx, BOOL * _Nonnull stop) {
//imageName就是元素,idx是索引,
}];
//这个方法可以同时取字典里面的key和value
[dict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
//可以同时取key和value
}];
//并发遍历,不阻塞主线程
[array enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
//遍历,并发执行代码块
}];