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

时间:2015-10-23 07:40:40

标签: ios objective-c nsarray

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

我知道:

  1. [NSArray array]
  2. [NSArray new]
  3. @[]
  4. [[NSArray alloc] init]
  5. 出于可读性原因,我通常坚持使用[NSArray array],但所有这些之间的区别是什么,他们是否真的都这样做?

2 个答案:

答案 0 :(得分:17)

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

[NSArray new][[NSArray alloc] init]返回一个+1保留计数的数组。在ARC之前,您必须释放或自动释放该阵列,否则您将泄漏内存。

[NSArray array]@[]返回已经自动释放的数组(保留计数0)。如果你希望它在没有ARC的情况下坚持下去,你必须手动保留它,否则当弹出当前自动释放池时它将被解除分配。

答案 1 :(得分:7)

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

  2. [NSArray new]allocinit并返回NSArray对象

  3. @[]:与1相同。

  4. [[NSArray alloc] init]:与2相同。

  5. [NSArray array][[NSArray alloc] init]之间的区别是,如果有非ARC:

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

    • [[NSArray alloc] init]是一个保留对象。因此,如果您想保留它,则无需再致电retain

    使用ARC,它们是相同的。