每个对象一个AutoreleasePool?

时间:2011-03-30 18:09:05

标签: c++ objective-c++ nsautoreleasepool

NSAutoreleasePool中我不能拥有“大”main() - 我不允许触摸它。那么每个对象有一个池是什么意思?

struct MacGuiEngine
{
  // members …

  ScopedAutoreleasePool pool;
};

struct MacFontEngine
{
  // members …

  ScopedAutoreleasePool pool;
};

这是一种有效的“模式”吗?

1 个答案:

答案 0 :(得分:1)

当您说无法触摸main()时,您何时致电UIApplicationMain()?我假设这是iOS,因为您不需要在Mac上的main()中创建自动释放池。无论您在哪里呼叫UIApplicationMain(),您都希望获得顶级自动释放池。

请记住,每个事件循环都会自动为您创建一个自动释放池,因此您通常不需要创建一个。我最初的实验是在iPad上从main()删除它至少不会造成任何泄漏。您可以通过在__NSAutoreleaseNoPool()上设置断点来查找。唯一的问题是在事件循环之前调用的方法。我相信如果以编程方式生成应用程序委托,则可以在事件循环之前调用其-init。但即使在app delegate +initialize中制作自动释放的对象也不会对我造成任何泄漏。

如果有任何地方你需要一个自动释放池(其中__NSAutoreleaseNoPool()被调用,你会看到类似“没有池自动释放的对象 - 只是泄漏”),那么你只需要在该方法中创建一个池:

- (id)someMethod {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    ....
    id result = ....

    [pool drain];
    return result;
}

但是我仍然有点不知道你是如何启动主要的runloop,但是无法创建自动释放池。