#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()函数,对吧?但我试了一下,“新事件......”日志消息就出现在应用程序启动时。所以我猜主线程中必须有另一个自动释放池。
答案 0 :(得分:5)
没有。所有Cocoa或CocoaTouch类都需要存在自动释放池才能不泄漏内存。因此,需要现有的自动释放池来调用UIApplicationMain()以覆盖在UIApplicationMain()的上下文中实例化的任何(可能)自动释放的对象。正如您在UIApplicationMain返回后看到的那样,这个外部自动释放池就在应用程序退出之前。内部(记住自动释放池可以嵌套并且自动释放的对象被添加到最新/最深的池中)自动释放池在应用程序的运行循环的每次迭代开始时创建,并在迭代结束时释放。因此,运行循环获取的每次迭代都是“自己的”自动释放池。如果处理事件可能会产生大量自动释放内存(在iPhone上是一个坏主意,但在OS X上很常见),您可能希望在事件处理代码中创建自己的内部自动释放池,这些代码可以在处理过程中释放事件
答案 1 :(得分:1)
不,这是应用程序中最外层的函数,是常规的C风格的main()。
iPhone应用程序所做的一切都在UIApplicationMain中进行,包括所有事件处理。