这可能是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代码是一个错误,因为它可能会泄漏内存。