1

我不能有一个“大” NSAutoreleasePool——main()我不能碰它。那么每个对象有一个池是什么意思?

struct MacGuiEngine
{
  // members …

  ScopedAutoreleasePool pool;
};

struct MacFontEngine
{
  // members …

  ScopedAutoreleasePool pool;
};

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

4

1 回答 1

1

当你说你不能碰main(),你什么时候打电话UIApplicationMain()?我假设这是 iOS,因为您不需要main()在 Mac 上创建自动释放池。无论您在哪里调用UIApplicationMain(),您都想要顶级自动释放池。

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

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

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

    [pool drain];
    return result;
}

但是我仍然有点不知道您如何启动主运行循环,但无法创建自动释放池。

于 2011-03-30T19:29:03.710 回答