显然我不只是指NSString;有[NSDictionary dictionary]
,[NSArray array]
等等。但是,当我们发送[NSDictionary new]
,[NSArray new]
等时,为什么要使用所有这些方法?
答案 0 :(得分:6)
原因主要是历史性的,因为两者之间的区别是创建对象的引用计数;自动参考计数几乎完全避免了对参考计数的关注。
+string
and methods like it返回不属于调用者的对象(它们位于自动释放池中)。另一方面,+new
是"four NARCs"之一, 创建拥有引用。
在ARC之前,您将选择具有特定情况下所需的内存管理影响的那个。现在,您可以使用您喜欢的任何一种。代码级别没有区别。
在某些循环情况下,您可能会发现最好使用+new
,因为与+string
相比,此still does apparently缩短了对象的生命周期。
答案 1 :(得分:3)
为了补充Josh的好答案,在使用ARC时,首选使用alloc] init]
或new
,因为您无需@autoreleasepool { ... }
来缓解自动释放压力。
请考虑以下代码:
for(int i = 0; i < X; i++)
{
//@autoreleasepool {
NSMutableArray* array = [NSMutableArray array];
for(int j = 0; j < Y; j++)
{
[array addObject:[NSString stringWithFormat:@"%d", j]];
}
///Do something with array.
//}
}
当X
和Y
增长时,您会发现内存增长,并且需要@autoreleasepool
,因为只有在自动释放池耗尽时才会释放对象。
现在考虑
for(int i = 0; i < X; i++)
{
NSMutableArray* array = [NSMutableArray new];
for(int j = 0; j < Y; j++)
{
[array addObject:[[NSString alloc] initWithFormat:@"%d", j]];
}
///Do something with array.
}
这里的对象一旦超出范围就会被释放,不再被保留。
答案 2 :(得分:2)
[NSDictionary dictionary]
,[NSArray array]
等方法返回自动释放对象。这意味着您没有这些对象的所有权,并且您不必担心内存管理
当您使用新或 alloc 时,您需要在完成使用后释放这些对象。
当您不使用ARC时,这种区别很重要。