为什么Xcode 4.2在main.m中使用@autoreleasepool而不是NSAutoreleasePool?

15

我注意到在Xcode 4.2中启动主函数的方式与以前不同:

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil,
                                 NSStringFromClass([PlistAppDelegate class]));
    }
}

int main(int argc, char *argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}

有人知道这两者之间的区别吗?


它被称为ARC(http://clang.llvm.org/docs/AutomaticReferenceCounting.html) - bealex
1个回答

15

第一个方法使用ARC,它在iOS5及以上的版本中实现了为您处理内存管理。

而在第二个方法中,您需要管理自己的内存,并创建一个自动释放池来处理主函数内发生的每个自动释放。

因此,在阅读有关iOS5中Obj-C的新内容后,似乎:

@autoreleasepool {
    //some code
}

与之相同的工作方式

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// some code
[pool release];

与最后一个不同的是,它在 ARC 上会抛出错误。

编辑

第一个是否使用 ARC。


20
请注意,@autoreleasepool 是一种新的语句,在 Objective-C 中可用,即使不使用 ARC 也可以使用。请参见12 - albertamg
7
现在使用@autoreleasepool是更好的选择。来自苹果公司的“过渡到ARC发布说明”:这种语法在所有的Objective-C模式中都可用。它比使用NSAutoReleasePool类更加高效;因此,鼓励您采用@autoreleasepool来替代使用NSAutoReleasePool - Mark Granoff
8
这个答案是错误的。“第一个方法使用了ARC”可能并没有使用ARC。 - user102008

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接