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 上 autoreleasepools 的内容?