Iphone main.m真的是由每个事件创建主运行循环的自动释放池的地方吗? #导入 int main(int argc,char*argv[]){ NSLog(@“新事件…”); NSAutoreleasePool*池=[[NSAutoreleasePool alloc]init]; int retVal=UIApplicationMain(argc,argv,nil,nil); [池释放]; 返回返回; }

Iphone main.m真的是由每个事件创建主运行循环的自动释放池的地方吗? #导入 int main(int argc,char*argv[]){ NSLog(@“新事件…”); NSAutoreleasePool*池=[[NSAutoreleasePool alloc]init]; int retVal=UIApplicationMain(argc,argv,nil,nil); [池释放]; 返回返回; },iphone,cocoa-touch,uikit,autorelease,Iphone,Cocoa Touch,Uikit,Autorelease,如果是这样,那么每个事件都必须调用main()函数,对吗?但我试过了,“新事件…”日志消息就在应用程序启动时出现。因此,我猜主线程中肯定有另一个自动释放池。不,这是应用程序中最外层的函数,一个常规的C风格main() iPhone应用程序所做的一切都发生在UIApplicationMain中,包括所有事件处理。否。所有Cocoa或CoCoCoatTouch类都需要存在自动释放池,以避免内存泄漏。因此,需要现有的自动释放池来调用UIApplicationMain(),以覆盖在UIApplicati

如果是这样,那么每个事件都必须调用main()函数,对吗?但我试过了,“新事件…”日志消息就在应用程序启动时出现。因此,我猜主线程中肯定有另一个自动释放池。

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


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

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

最外层的“main()”自动释放池有什么意义,因为所有的应用程序内存在退出时都会被操作系统回收?我很好奇为什么苹果没有在UIApplicationMain()的实现中包含一个顶级的自动释放池。谢谢。是的,我也在想。。。可能在UIApplicationMain()中的主运行循环旁边发生了一些-autorelease的东西……在类接收到第一条消息之前,会向类发送一个+initialize方法。除非UIApplicationMain(或任何用户提供的替换)的编写者非常小心地实例化自动释放池或对Cocoa派生类的任何其他调用,否则这可能会导致内存泄漏——这些+初始化方法可能会自动释放对象。最安全的计划是在调用任何依赖Cocoa的代码之前建立一个自动释放池。当然,UIApplicationMain可能会创建自己的自动释放池。@Daniel没有理由,只是为了明确和彻底,池需要在应用程序退出之前立即排空。Barry,没有最外层的自动释放池不会导致正常意义上的泄漏,因为当main()时,所有内存都会被释放反正还是回来了。然而,类可以做的事情并不是在dealloc中释放内存,例如完成文件编写或干净地关闭网络连接。
#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;
}