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

Tha*_*nks 2 iphone cocoa-touch autorelease uikit

#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;
}
Run Code Online (Sandbox Code Playgroud)

如果是这种情况,则必须在每个事件上调用main()函数,对吧?但我试了一下,"新事件......"日志消息就出现在应用程序启动时.所以我猜在主线程中必须有另一个自动释放池.

Bar*_*ark 5

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

  • Barry,没有最外层的自动释放池不会导致正常意义上的泄漏,因为无论如何都会在main()返回时释放所有内存.但是,类可以在-dealloc中执行除释放内存之外的操作,例如完成写入文件或干净地关闭网络连接. (2认同)