我有一个构建和返回数组的方法:
- (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]
是否存在性能或内存损失/差异?
最佳答案
[[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
关于Objective-C:@[]和[[NSArray alloc] initWithCapacity:0]有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47931535/