主要的iOS autoreleasepool和ARC alloc,发布

时间:2015-03-30 15:49:51

标签: objective-c

这可能是来自iOS新手的一个天真的问题。

我看到典型的iOS应用程序main.m有以下代码:

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


    }
}

在iOS应用程序中围绕UIApplicationMain使用自动释放池有什么意义? UIApplicationMain在应用程序实际退出之前不会返回,所以为什么在autoreleasepool中有UIApplicationMain(),它会为应用程序执行期间分配的所有对象触发'free'。

2 个答案:

答案 0 :(得分:3)

目前,使用LLVM编译器,默认情况下每个线程都有一个自动释放池,这是不需要的。如果对自动释放池使用不同的编译器(它们现在是语言功能),则需要为每个线程设置自动释放池。呼叫永远不会返回无关紧要,必须设置池(并且由于它可以将其耗尽)。

我无法找到重复的问题,但我相信它已存在。

答案 1 :(得分:0)

来自Using Autorelease Pool Blocks

  

Cocoa总是希望代码在自动释放池块中执行,否则自动释放的对象不会被释放而应用程序会泄漏内存。 (如果在自动释放池块之外发送autorelease消息,Cocoa会记录一条合适的错误消息。)AppKit和UIKit框架处理每个事件循环迭代(例如鼠标按下事件或轻击)自动释放池块。

TLDR:在自动释放块之外运行Cocoa代码是一个错误,因为它可能会泄漏内存。