NSArray.array/.new /@[]/alloc-init 之间的区别

Difference between NSArray.array/.new /@[]/alloc-init

似乎有不同的实例化 NSArray 的方法(与 NSDictionary 和其他一些方法相同)。

我知道:

  1. [NSArray array]
  2. [NSArray new]
  3. @[]
  4. [[NSArray alloc] init]

出于可读性原因,我通常坚持使用 [NSArray array],但它们之间有什么区别,它们真的都做同样的事情吗?

  1. [NSArray array] : 创建并return一个空数组

  2. [NSArray new] : alloc, init 和 return 一个 NSArray 对象

  3. @[] : 同 1.

  4. [[NSArray alloc] init] : 同 2.

[NSArray array][[NSArray alloc] init] 的区别在于是否存在非 ARC:

  • [NSArray array] 是一个自动释放对象。如果你想保留它,你必须调用 retain。例如,当你 return 一个数组时。

  • [[NSArray alloc] init]是一个保留对象。所以如果你想保留它,你不必再调用 retain

对于 ARC,它们是相同的。

它们的结果都是一样的,你得到一个新的空 immutable 数组。不过,这些方法具有不同的内存管理含义。 ARC 最终没有区别,但在 ARC 之前,您必须使用正确的版本或发送适当的保留、释放或自动释放消息。

  • [NSArray new], [[NSArray alloc] init] return 保留计数为 1 的数组。在 ARC 之前,您必须释放或自动释放该数组,否则会泄漏内存.

  • [NSArray array], @[] return 一个已经自动释放的数组(保留计数为 0)。如果你想让它在没有 ARC 的情况下继续存在,你必须手动保留它,否则它会在当前自动释放池弹出时被释放。