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

4

2 回答 2

5

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

于 2009-04-28T17:31:40.953 回答
1

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

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

于 2009-04-28T17:16:50.410 回答