iOS autoreleasepool in main 和 ARC alloc 发布

Posted

技术标签:

【中文标题】iOS autoreleasepool in main 和 ARC alloc 发布【英文标题】:iOS autoreleasepool in main, and ARC alloc, release 【发布时间】:2015-03-30 15:49:50 【问题描述】:

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

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

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


    

在 iOS 应用程序中围绕 UIApplicationMain 设置 autoreleasepool 有什么意义? UIApplicationMain 在应用程序实际退出之前不会返回,那么为什么在 autoreleasepool 中有 UIApplicationMain(),它会触发应用程序执行期间分配的所有对象的“空闲”。

【问题讨论】:

我在这里找到了更好的短语问题和答案 - ***.com/questions/8549711/… 但是感谢回答我问题的人。 【参考方案1】:

目前,使用 LLVM 编译器,每个线程默认都有一个自动释放池,这不是必需的。如果您为自动释放池使用具有不同实现的不同编译器(它们现在是一种语言功能),则需要为每个线程设置一个自动释放池。调用永远不会返回并不重要,必须设置池(并且由于它可以耗尽它)。

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

【讨论】:

【参考方案2】:

来自Using Autorelease Pool Blocks:

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

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

【讨论】:

以上是关于iOS autoreleasepool in main 和 ARC alloc 发布的主要内容,如果未能解决你的问题,请参考以下文章

iOS 9 中的 autoreleasePool 有啥不同?

[iOS开发]@autoreleasepool原理探究

[iOS开发]@autoreleasepool原理探究

如何了解 iOS 上 autoreleasepools 的内容?

在 iOS 4.0 上释放 Autoreleasepool 崩溃(以及在 4.1 上......)

iOS之深入解析自动释放池autoreleasepool的底层原理