Objective-C:@ []和[[NSArray alloc] initWithCapacity:0]之间的区别是什么

时间:2017-12-21 19:25:58

标签: objective-c cocoa nsmutablearray objective-c-literals

我有一个构建并返回数组的方法:

- (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]

是否存在性能或内存损失/差异?

1 个答案:

答案 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