【问题标题】:Objective-C: What's the difference between @[ ] and [[NSArray alloc] initWithCapacity:0] [duplicate]Objective-C:@[] 和 [[NSArray alloc] initWithCapacity:0] 有什么区别 [重复]
【发布时间】:2017-12-21 19:25:58
【问题描述】:

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

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

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

【问题讨论】:

  • 你不能自己测试一下吗?您可以循环调用它一百万次,看看两者之间的速度是否不同。您可以使用 Instruments 来查看内存大小是否存在差异。另外,直接语法是否创建了一个可变或不可变的实例?我对文档的阅读只显示了不可变的创造。
  • 不要在getter前加上get(objc一般不使用get前缀)。

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


【解决方案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

【讨论】:

  • 小点; initWithCapacity: 不一定要预先分配空间。它只是提示可变数组应该如何优化管理内存。
猜你喜欢
  • 2011-08-29
  • 2016-02-18
  • 1970-01-01
  • 1970-01-01
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
相关资源
最近更新 更多