在每个循环中使用 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
我想知道 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