NSArray *emptyArray = [NSArray array];
NSArray *emptyArray = [[NSArray alloc] init];
它们似乎都创建了空数组。那有什么区别?
答案 0 :(得分:4)
他们做了类似的事情,但并不完全相同。
[NSArray array]
创建一个自动释放的数组
[[NSArray alloc] init]
创建一个保留计数为1的数组,使emptyArray成为其所有者。
使用ARC,您不会发现太多差异,但是通过手动内存管理,您将会发现。如果您正在使用ARC,您可以安全地使用它,但我建议您坚持使用一种格式(我个人更喜欢使用alloc / init)。
以下是来自NSArray.m的GNUstep的摘录,紧跟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]
。