这两行Objective-C代码有什么区别?

时间:2014-02-27 04:14:01

标签: objective-c nsarray

NSArray *emptyArray = [NSArray array];

NSArray *emptyArray = [[NSArray alloc] init];

它们似乎都创建了空数组。那有什么区别?

4 个答案:

答案 0 :(得分:4)

他们做了类似的事情,但并不完全相同。

[NSArray array]创建一个自动释放的数组 [[NSArray alloc] init]创建一个保留计数为1的数组,使emptyArray成为其所有者。

使用ARC,您不会发现太多差异,但是通过手动内存管理,您将会发现。如果您正在使用ARC,您可以安全地使用它,但我建议您坚持使用一种格式(我个人更喜欢使用alloc / init)。

以下是来自NSArray.mGNUstep的摘录,紧跟Apple的Cocoa(以前是NeXT的OpenStep):

/**
 * Returns an empty autoreleased array.
 */
+ (id) array
{
  id    o;

  o = [self allocWithZone: NSDefaultMallocZone()];
  o = [o initWithObjects: (id*)0 count: 0];
  return AUTORELEASE(o);
}

答案 1 :(得分:0)

区别在于如何管理内存:

NSArray *emptyArray = [NSArray array];

在这种情况下,emptyArray指向自动释放的数组对象,这意味着您不拥有该对象。但这也意味着,如果您不使用ARC,则不能在当前运行循环后使用此对象,除非您增加它的保留计数,因为它可能会被销毁。

NSArray *emptyArray = [[NSArray alloc] init];

在这种情况下,您会得到一个保留计数为+1的数组。这意味着当您使用完内存时,您负责释放内存。

如果您不使用ARC,则此差异特别重要

答案 2 :(得分:0)

NSArray *emptyArray = [NSArray array];

类似于

NSArray *emptyArray = [[[NSArray alloc] init] autorelease];

这意味着,[NSArray array]会返回自动释放的对象。因此,您不需要释放使用[NSArray array]创建的对象。

但您有责任释放使用[[NSArray alloc] init]创建的对象。

答案 3 :(得分:0)

基本上从类方法返回的新实例返回自动释放的实例,这实际上意味着IOS拥有它的所有权,因此无需担心释放它。

NSArray *arr=[NSArray array];NSArray *emptyArray=[[[NSArray alloc] init] autorelease];

相同

如果您正在使用MRC,则使用[[NSArray alloc] init]时,您有责任在ARC自动照顾时释放。

因此无论使用ARC还是MRC,最好使用[NSArray array]

相关问题