我有一个构建并返回数组的方法:
- (NSArray *)foo
{
NSUInteger capacity = [self getArrayCapacity];
if (capacity == 0) {
return @[];
} else {
NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:capacity];
// add elements to the array, as many as capacity
...
return array;
}
}
如果我按如下方式简化代码,使用的内存或性能是否存在差异:
- (NSArray *)fooSimplified
{
NSUInteger capacity = [self getCapacity];
NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:capacity];
// add elements to the array, as many as capacity
...
return array;
}
}
因此,当capacity == 0
而不是返回@[]
时,它会返回[[NSMutableArray alloc] initWithCapacity:0]
是否存在性能或内存损失/差异?
答案 0 :(得分:1)
[[NSMutableArray alloc] initWithCapacity:0]
这将创建一个可变数组,并分配足以容纳指定数量元素的内存,因此可以根据实现情况使用足够多的数据。
@[]
优化为返回__NSArray0类的实例,每次创建时都是相同的实例,因此在这种情况下没有额外的内存分配。
因此使用@[]
更为理想,但除非您经常调用此函数,否则您可能看不到真正的差异。
在iOS模拟器中运行一些基准:
NSLog(@"%llu", dispatch_benchmark(100, ^{
for (int i = 0; i < 1000000; ++i) {
NSArray *a = @[];
}
}));
NSLog(@"%llu", dispatch_benchmark(100, ^{
for (int i = 0; i < 1000000; ++i) {
NSArray *a = [[NSMutableArray alloc] initWithCapacity:0];
}
}));
Array Literal: 9835575 ns
Mutable Array: 157169503 ns