NSArray其中的方法--遍历,

Posted 西贝了爷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NSArray其中的方法--遍历,相关的知识,希望对你有一定的参考价值。

 

1. ForLoopFor - inenumerateObjects这个三个方法的区别:

遍历一个数组用For-in最快.

通过Value查询index的时候, 面对大量的数组推荐使用 enumerateObjectsWithOptions的并行方法.

遍历字典类型的时候, enumerateKeysAndObjectsUsingBlock效率最高

  1.1遍历数组

    
    NSMutableArray *test = [NSMutableArray array];
    for (int i = 0; i < 1000000; i ++) {
        [test addObject:@(i)];
    }
    
    //ForLoop方法
    __block int sum = 0;
    double date_s = CFAbsoluteTimeGetCurrent();
    for (int i = 0; i < test.count; i ++) {
        sum += [test[i] integerValue];
    }
    double date_current = CFAbsoluteTimeGetCurrent() - date_s;
    NSLog(@"Sum : %d ForLoop Time: %f ms",sum,date_current * 1000);
    
    //For - in方法
    sum = 0;
    date_s = CFAbsoluteTimeGetCurrent();
    for (NSNumber *num in test) {
        sum += [num integerValue];
    }
    date_current = CFAbsoluteTimeGetCurrent() - date_s;
    NSLog(@"Sum : %d For-in Time: %f ms",sum,date_current * 1000);
    
    //enumerateObjectsUsingBlock方法
    sum = 0;
    date_s = CFAbsoluteTimeGetCurrent();
    [test enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        sum += [obj integerValue];
    }];
    date_current = CFAbsoluteTimeGetCurrent() - date_s;
    NSLog(@"Sum : %d enumrateBlock Time: %f ms",sum,date_current * 1000);

打印如下:

      

总结:遍历一个数组用For-in最快.

 

  1.2-通过Value查找Index看谁快

实验:For - inenumerateObjectsUsingBlockenumerateObjectsWithOptions 这个三个方法: (ForLoop已经不再继续讨论了) 

 

    NSMutableArray *test = [NSMutableArray array];
    for (int i = 0; i < 10000000; i ++) {
        [test addObject:@(i + 10)];
    }

    //For-in
    __block NSInteger index = 0;
    double date_s = CFAbsoluteTimeGetCurrent();
    for (NSNumber *num in test) {
        if ([num integerValue] == 9999999) {
            index = [test indexOfObject:num];
            break;
        }
    }
    double date_current = CFAbsoluteTimeGetCurrent() - date_s;
    NSLog(@"index : %ld For-in Time: %f ms",(long)index,date_current * 1000);

    //enumerateObjectsUsingBlock
    index = 0;
    date_s = CFAbsoluteTimeGetCurrent();
    [test enumerateObjectsUsingBlock:^(id num, NSUInteger idx, BOOL *stop) {
        if ([num integerValue] == 9999999) {
            index = idx;
            *stop = YES;
        }
    }];
    date_current = CFAbsoluteTimeGetCurrent() - date_s;
    NSLog(@"index : %ld enumerateBlock Time: %f ms",(long)index,date_current * 1000);

    //enumerateObjectsWithOptions
    index = 0;
    date_s = CFAbsoluteTimeGetCurrent();
    [test enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id num, NSUInteger idx, BOOL *stop) {
        if ([num integerValue] == 9999999) {
            index = idx;
            *stop = YES;
        }
    }];
    date_current = CFAbsoluteTimeGetCurrent() - date_s;
    NSLog(@"index : %ld enumerateObjectsWithOptions Time: %f ms",(long)index,date_current * 1000);

 

打印:

  

结论:通过Value查询index的时候, 面对大量的数组推荐使用 enumerateObjectsWithOptions的并行方法.

 

  1.3遍历字典

这里我们比较一下使用 For-in 和 enumerateKeysAndObjectsUsingBlock 这个两个方法:

 

    NSDictionary *testDictionary = @{
                                     @"Auther" : @"yyyyy",
                                     @"Game" : @"Dota",
                                     @"App" : @"dddddd",
                                     @"Market" : @"AppStore"
                                     };
    
    NSMutableArray *forInArry1 = [NSMutableArray array];
    NSMutableArray *forInArry2 = [NSMutableArray array];
    NSMutableArray *enumArry = [NSMutableArray array];
    
    
    //For - in方法 直接allValues
    double date_s = CFAbsoluteTimeGetCurrent();
    NSArray *values = testDictionary.allValues;
    for (NSString *value in values) {
        [forInArry1 addObject:value];
    }
    double date_current = CFAbsoluteTimeGetCurrent() - date_s;
    NSLog(@"index : %ld For-in-forInArry1 Time: %f ms",(long)index,date_current * 1000);
    
    //For - in方法,+根据key取value值
    date_s = CFAbsoluteTimeGetCurrent();
    NSArray *keys = testDictionary.allKeys;
    for (NSString *key in keys) {
                NSString *Value = testDictionary[key];
        [forInArry2 addObject:Value];
    }
    date_current = CFAbsoluteTimeGetCurrent() - date_s;
    NSLog(@"index : %ld For-in-forInArry2 Time: %f ms",(long)index,date_current * 1000);
    
    //enumerateKeysAndObjectsUsingBlock方法.
    date_s = CFAbsoluteTimeGetCurrent();
    [testDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        [enumArry addObject:obj];
    }];
    date_current = CFAbsoluteTimeGetCurrent() - date_s;
    NSLog(@"index : %ld enumerateKeysAndObjectsUsingBlock Time: %f ms",(long)index,date_current * 1000);
    

 

打印:

 

 

结论:遍历字典类型的时候, enumerateKeysAndObjectsUsingBlock效率最高

以上是关于NSArray其中的方法--遍历,的主要内容,如果未能解决你的问题,请参考以下文章

使用对象和键迭代 NSArray 的最快方法

Swift中实现Array数组和NSArray数组的相互转换与遍历

iOS中遍历数组的方法

IOS 开发中遍历数组的方法及比较

Objective-C中遍历数组NSArray方式

循环遍历 NSDictionary 以创建单独的 NSArray