main.m真的是这个地方,主要运行循环的自动释放池是由每个事件创建的吗?

时间:2009-04-28 17:08:25

标签: iphone cocoa-touch uikit autorelease

#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()函数,对吧?但我试了一下,“新事件......”日志消息就出现在应用程序启动时。所以我猜主线程中必须有另一个自动释放池。

2 个答案:

答案 0 :(得分:5)

没有。所有Cocoa或CocoaTouch类都需要存在自动释放池才能不泄漏内存。因此,需要现有的自动释放池来调用UIApplicationMain()以覆盖在UIApplicationMain()的上下文中实例化的任何(可能)自动释放的对象。正如您在UIApplicationMain返回后看到的那样,这个外部自动释放池就在应用程序退出之前。内部(记住自动释放池可以嵌套并且自动释放的对象被添加到最新/最深的池中)自动释放池在应用程序的运行循环的每次迭代开始时创建,并在迭代结束时释放。因此,运行循环获取的每次迭代都是“自己的”自动释放池。如果处理事件可能会产生大量自动释放内存(在iPhone上是一个坏主意,但在OS X上很常见),您可能希望在事件处理代码中创建自己的内部自动释放池,这些代码可以在处理过程中释放事件

答案 1 :(得分:1)

不,这是应用程序中最外层的函数,是常规的C风格的main()。

iPhone应用程序所做的一切都在UIApplicationMain中进行,包括所有事件处理。