在每个循环中使用 Objective-C 中的访问器

Using accessors in Objective-C for each loop

我想知道 Objective-C 中的以下代码片段在性能上是否存在差异:

NSArray *theArray = [self someArray];

for (NSObject *obj in theArray)
{
    // do something
}

对比

for(NSObject *obj in [self someArray])
{
    // do something
}

我假设后者会编译成与前者相同的结果,但我的一位同事认为后者每次迭代都使用访问器 [self someArray]。

有没有人有一定的 Objective-C 知识知道在循环 header 中使用访问器方法是否会影响性能?我正在使用的 collections 将有数十万,如果不是数百万, objects.

谢谢!

你是对的。访问器只被调用一次。一个简单的测试证明了这一点:

@import Foundation;
#import <objc/runtime.h>

@interface M : NSObject
@property (nonatomic, strong) NSArray *array;
@end

@implementation M
- (NSArray *)array { NSLog(@"moo"); return @[ @1, @2, @3 ]; }
@end

int main(int argc, char **argv)
{
        M *m = [M new];

        for (NSNumber *n in m.array) {
                NSLog(@"%@", n);
        }

        return 0;
}

这个测试程序的输出是:

2015-11-23 11:54:48.937 a.out[93427:5794850] moo
2015-11-23 11:54:48.939 a.out[93427:5794850] 1
2015-11-23 11:54:48.939 a.out[93427:5794850] 2
2015-11-23 11:54:48.939 a.out[93427:5794850] 3