#import <UIKit/UIKit.h>
int main(int argc, char *argv[]) {
NSLog(@"new event...");
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}
如果是这样的话,那么 main() 函数就必须在每个事件上调用,对吧?但我尝试了,“新事件...”日志消息在应用程序启动时出现。所以我猜测主线程中一定还有另一个自动释放池。
最佳答案
没有。所有 Cocoa 或 CocoaTouch 类都需要存在自动释放池,以免泄漏内存。因此,需要现有的自动释放池来调用 UIApplicationMain(),以覆盖在 UIApplicationMain() 上下文中实例化的任何(可能)自动释放对象。正如您所看到的,这个外部自动释放池在 UIApplicationMain 返回后、应用程序退出之前被耗尽。内部(请记住,自动释放池可以嵌套,并且自动释放对象会添加到最新/最深的池中)自动释放池在应用程序运行循环的每次迭代开始时创建,并在迭代结束时释放。因此,运行循环的每次迭代都是“自己的”自动释放池。如果处理事件可能会生成大量自动释放内存(在 iPhone 上这是一个坏主意,但在 OS X 上很常见),您可能需要在事件处理代码中创建自己的内部自动释放池,该池可以在处理该事件期间释放事件。
关于iphone - main.m 真的是每个事件创建主运行循环的自动释放池的地方吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/798950/