1

考虑:

- (void) testing {
    NSMutableArray * numbers = [NSMutableArray arrayWithCapacity:10000000] ;
    for (int i = 0 ; i < 10000000 ; ++i) {
        [numbers addObject:@(i)] ;
    }

    NSInteger (^sum)(NSInteger, NSInteger) = ^(NSInteger running, NSInteger n) {
        return running + n ;
    } ;

    double start = ::CACurrentMediaTime() ;
    __block NSInteger running = 0 ;
    for (NSNumber * n in numbers) {
        running = sum(running, [n integerValue]) ;
    }
    running = 0 ;
    double end1 = ::CACurrentMediaTime() ;
    [numbers enumerateObjectsUsingBlock:^(NSNumber * n, NSUInteger idx, BOOL *stop) {
        running = sum(running, [n integerValue]) ;
    }] ;
    double end2 = ::CACurrentMediaTime() ;

    ::NSLog(@"fastEnum: %0.3f, enumUsingBlock: %0.3f", end1-start, end2-end1) ;
}

这输出:

2013-08-05 00:38:34.852 WC[48299:a0b] fastEnum: 0.341, enumUsingBlock: 1.358

这表示这enumerateObjectsUsingBlock比常规迭代慢 4 倍左右。

什么时候使用其中一种?enumerateObjectsUsingBlock证明其成本合理的“附加价值”是什么?

4

1 回答 1

4

Mattt Thompson在 NSHipster 上写了一篇很棒的文章,介绍了使用 Objective-C 进行迭代的多种方法。

提供的附加值enumerateObjectsUsingBlock是给出对象的索引和NSEnumerationOptions

enum {
   NSEnumerationConcurrent = (1UL << 0),
   NSEnumerationReverse = (1UL << 1),
};
typedef NSUInteger NSEnumerationOptions;

引用马特:

除非您在迭代时确实需要数字索引,否则使用 for/in NSFastEnumeration 循环几乎总是更快。

(...)

同样,快速枚举几乎肯定比块枚举快得多,但如果您不习惯使用块,这些选项可能会很有用。

于 2013-08-05T04:09:15.800 回答