3

我正在读一本书,上面写着(如果我没有弄错的话)用@autoreleasepool语句包装一些代码可以启用 ARC。首先是这样吗?

我的第二个问题是,当我在做一些 iOS 示例程序时,虽然我在创建新项目时启用了 ARC,但我从来没有看到在任何地方使用过这个指令(在自动生成的代码中)。这是否意味着没有使用ARC?任何想法/指针表示赞赏。

4

4 回答 4

4

@autoreleasepool不“启用”ARC。这只是使用自动释放池的 ARC 方式。

在 ARC 之前,您使用NSAutoreleasePool该类来设置一个自动释放池,如下所示:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Code benefitting from a local autorelease pool.
[pool release];

但是在使用 ARC 时不允许调用release,因此引入了一种使用自动释放池的新方法:

@autoreleasepool {
    // Code benefitting from a local autorelease pool.
}

@autoreleasepool块比直接使用实例更有效NSAutoreleasePool;即使您不使用 ARC,也可以使用它们。

于 2012-09-16T15:30:31.570 回答
4

首先,这本书是错误的。@autoreleasepool 与 ARC 正交。你可以使用没有 ARC 的自动释放池,也可以使用没有自动释放池的 ARC(但你不应该这样做)。

其次,使用任何 Xcode 的默认项目创建的项目的主线程将为您创建自动释放池池。您创建的任何线程都需要创建自己的自动释放池。

于 2012-09-16T15:40:19.717 回答
2

使用 @autoreleasepool 语句包装一些代码启用 ARC

否。ARC 由编译器标志启用。@autoreleasepool只是一个用于创建自动释放池的关键字,即使您使用的是 ARC(因为通常您会分别使用 alloc-init 和 release 创建和销毁它们,但是您不能release在 ARC 下发送显式消息 - 这就是为什么这个关键字有已介绍。)

如果你在 Xcode/使用编译器/等启用 ARC,它就会被启用。当然,有比“自动释放一切”原则更好的解决方案,这可能是您在示例代码中没有遇到这个关键字的原因。

于 2012-09-16T15:27:53.697 回答
2

我的第二个问题是,当我在做一些 iOS 示例程序时,虽然我在创建新项目时启用了 ARC,但我从来没有看到在任何地方使用过这个指令(在自动生成的代码中)。这是否意味着没有使用ARC?任何想法/指针表示赞赏。

您的应用程序确实使用了它。查看项目中的main.m文件。你会在那里找到它。

于 2012-09-16T15:45:12.480 回答