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

Mar*_*Him 8 objective-c nsarray ios

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

我知道:

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

出于可读性的原因,我经常坚持[NSArray array],但所有这些之间有什么区别,他们都真的这样做吗?

Sve*_*ven 17

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

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

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


tul*_*dev 7

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

  2. [NSArray new] :alloc,init并返回一个NSArray对象

  3. @[] :与1相同.

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

不同之间[NSArray array][[NSArray alloc] init]是否有非ARC:

  • [NSArray array]是一个自动释放对象.retain如果你想保留它,你必须打电话.例如,当你return一个阵列.

  • [[NSArray alloc] init]是一个保留的对象.所以retain如果你想保留它,你不必再打电话.

使用ARC,它们是相同的.