iOS自动释放池在主,ARC分配,发布



这可能是iOS新手提出的一个天真的问题。

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

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

    }
}

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

当前,使用LLVM编译器,默认情况下每个线程都有一个自动释放池,这是不需要的。如果您使用不同的编译器来实现自动发布池(它们现在是一种语言功能),则需要为每个线程设置一个自动发布池。呼叫永远不会返回并不重要,必须设置池(而且池可以因此而耗尽)。

我找不到重复的问题,但我确信它在那里。

使用自动释放池块:

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

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

最新更新