0

我有一个方法来构建和返回一个数组:

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

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

4

1 回答 1

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
于 2017-12-21T19:45:45.233 回答