当我们写[NSString new]时,为什么我们有[NSString string]?

时间:2014-02-17 21:09:28

标签: cocoa-touch cocoa constructor

显然我不只是指NSString;有[NSDictionary dictionary][NSArray array]等等。但是,当我们发送[NSDictionary new][NSArray new]等时,为什么要使用所有这些方法?

3 个答案:

答案 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.

    //}
}

XY增长时,您会发现内存增长,并且需要@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时,这种区别很重要。