我正在读一本书(如果我没有弄错的话)用@autoreleasepool
语句包装一些代码来启用ARC。首先是这种情况吗?
我的第二个问题是当我在做一些iOS示例程序时,虽然我在创建一个新项目时启用了ARC,但我从未在任何地方看到过这个指令(在自动生成的代码中)。这是否意味着ARC没有被使用?任何想法/指针都表示赞赏。
答案 0 :(得分:4)
@autoreleasepool
没有"启用"弧。它只是使用自动释放池的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,也可以使用它们。
答案 1 :(得分:4)
首先,这本书是错的。 @autoreleasepool与ARC正交。您可以在没有ARC的情况下使用自动释放池,并且可以在没有自动释放池的情况下使用ARC(但您不应该这样做)。
其次,使用Xcode的任何默认项目创建的项目的主线程将为您创建自动释放池。您创建的任何线程都需要创建自己的自动释放池。
答案 2 :(得分:2)
用@autoreleasepool语句包装一些代码启用ARC
没有。 ARC由编译器标志启用。 @autoreleasepool
只是用于创建自动释放池的关键字,即使您正在使用ARC(因为通常您将分别使用alloc-init和release创建并销毁它们,但您无法发送显式{{1} ARC下的消息 - 这就是为什么引入这个关键字的原因。)
如果您在Xcode /中使用编译器/ etc启用ARC,则启用它。当然,有比“autorelease everything”原则更好的解决方案,这可能是您在示例代码中没有遇到此关键字的原因。
答案 3 :(得分:2)
我的第二个问题是当我在做一些iOS示例程序时,虽然我在创建一个新项目时启用了ARC,但我从未在任何地方看到过这个指令(在自动生成的代码中)。这是否意味着ARC没有被使用?任何想法/指针都表示赞赏。
你的应用确实使用了它。查看项目中的 main.m 文件。你会在那里找到它。