这可能是来自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'。
答案 0 :(得分:3)
目前,使用LLVM编译器,默认情况下每个线程都有一个自动释放池,这是不需要的。如果对自动释放池使用不同的编译器(它们现在是语言功能),则需要为每个线程设置自动释放池。呼叫永远不会返回无关紧要,必须设置池(并且由于它可以将其耗尽)。
我无法找到重复的问题,但我相信它已存在。
答案 1 :(得分:0)
来自Using Autorelease Pool Blocks:
Cocoa总是希望代码在自动释放池块中执行,否则自动释放的对象不会被释放而应用程序会泄漏内存。 (如果在自动释放池块之外发送
autorelease
消息,Cocoa会记录一条合适的错误消息。)AppKit和UIKit框架处理每个事件循环迭代(例如鼠标按下事件或轻击)自动释放池块。
TLDR:在自动释放块之外运行Cocoa代码是一个错误,因为它可能会泄漏内存。