Objective-C:@[]和[[NSArray alloc] initWithCapacity:0]有什么区别

标签 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]

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

最佳答案

[[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/

相关文章:

iphone - 从 iPhone 相册导入和保存照片的正确方法是什么?

iOS:出现键盘时触发什么事件

objective-c - 从类方法调用实例方法

macos - 如何获得像这样的 NSWindow 标题栏样式

ios - 如果某些字符串为空,如何在 nsmutablearray 中添加字符串对象

ios - 使用 MKMapKit 显示用户位置( Objective-C )

ios - WKWebview 未检测为移动设备

cocoa - Mac 应用程序中的 NSUserDefaults

ios - 如何从音频处理中锁定数组以进行分析

iOS:归档 NSMutableArray