【问题标题】:When is the main Autorelease Pool in Cocoa-touch drained?Cocoa-touch 中的主自动释放池何时耗尽?
【发布时间】:2011-06-24 12:40:10
【问题描述】:
#import <UIKit/UIKit.h>

int main(int argc, char *argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}

主方法在应用退出后调用pool上的release,顺便将release发送给pool中的所有对象。但是因为在应用程序内部创建的自动释放对象在应用程序退出之前不会一直存在,因此在运行循环期间的某个时刻,池要么被耗尽要么被释放(在 iPhone 的上下文中,drain==release.. 除非我需要在这一点上更正!)。但是有人确切地知道这种情况何时发生吗?在运行循环结束时将池排空并在下一个开始时分配一个新池似乎是合乎逻辑的,但我找不到任何关于此的确定信息。 Here's a discussion 在苹果论坛上,但它似乎高度投机(更不用说有争议了,接近尾声)。 谁能给我一个答案,最好有文档或源代码(甚至是实验程序)的证据?

【问题讨论】:

  • 您引用的特定池在应用程序结束之前不会耗尽,但每次调用运行循环都会创建自己的池,嵌套在应用程序的运行循环中。
  • 这是有道理的。那么,如果我从不创建自己的池,那么默认情况下,给定的应用程序将有两个嵌套池?
  • 是的;运行循环内的外部池和循环池。 UIApplicationMain() 也可以创建/排水池作为实现细节。

标签: objective-c cocoa-touch autorelease


【解决方案1】:

来自NSAutoreleasePool Class Reference

Application Kit 在事件循环的每个循环开始时在主线程上创建一个自动释放池,并在结束时将其排空,从而释放在处理事件时生成的所有自动释放对象。

【讨论】:

  • 如果有任何疑问,OS X 版本和 iOS 版本的 NSAutoreleasePool 文档都包含此声明,因此显然它在两个平台上都成立。
猜你喜欢
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 2012-08-08
  • 1970-01-01
相关资源
最近更新 更多