c++ - 每个对象一个 AutoreleasePool?

标签 c++ objective-c++ nsautoreleasepool

我不能在 main() 中有一个“大的”NSAutoreleasePool——我不允许碰它。那么每个对象有一个池呢?

struct MacGuiEngine
{
  // members …

  ScopedAutoreleasePool pool;
};

struct MacFontEngine
{
  // members …

  ScopedAutoreleasePool pool;
};

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

最佳答案

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

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

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

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

    [pool drain];
    return result;
}

但我仍然有点不知道你是如何开始你的主运行循环的,但不能创建一个自动释放池。

关于c++ - 每个对象一个 AutoreleasePool?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5490333/

相关文章:

android - 适用于 Android 的 openCV - 不是 opencv-android-sdk

xcode - Xcode无法识别C++语法

objective-c - @autoreleasepool 在@token 之前期望表达式

iphone - -[CALayer保留] : message sent to deallocated instance

xcode "compile source as"覆盖特定文件

ios - 我想构建应用程序来培训人们使用内存 (iOS)

带有 CMake 和 SetupTools 的 Python 2.7 C++ 扩展?

c++ - 在模板中使用 std::max 时出错

c++ - 如何初始化作为结构指针的类成员

c++ - 适用于 iPhone 的 C 与 C++(Objective-C 与 Objective-C++)