2011-03-30 65 views
1

我不能有一个“大”NSAutoreleasePoolmain() - 我不允许触摸它。那么,每个对象有一个池是什么?每个对象一个AutoreleasePool?

struct MacGuiEngine 
{ 
    // members … 

    ScopedAutoreleasePool pool; 
}; 

struct MacFontEngine 
{ 
    // members … 

    ScopedAutoreleasePool pool; 
}; 

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

回答

1

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

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

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

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

    [pool drain]; 
    return result; 
} 

但我仍然有点在你如何开始你的主runloop的损失,但不能创建一个autorelease池。

+0

对不起,我应该告诉你更多的细节。我正在使用Mac,而不是iOS。我有我自己的事件循环,我可以创建一个NSAutoreleasePool。但在我调用MacEventLoop :: run()之前会使用MacFontEngine(MacEventLoop是我自己的事件循环)。这就是我提出这个想法的方式,MacGuiEngine,MacFontEngine等应该在那里保留一个自动释放池。 – Schwitzgabel 2011-03-30 21:49:33

+0

好的,所以你正在构建一个围绕可可的C++包装,我猜测?是的,我也创建了其中的一个....没有明智的方法来给每个对象自己的autoreleasepool。池在栈上生存,并且对于给定的线程,在任何时候都只有一个全局活动,并且它们需要定期销毁以释放内存。当从C++调用到ObjC中时,必须包装你的public(可以从C++调用)方法,如上面在someMethod中所示。一定要阅读'NSAutoreleasePool'上的文档。它解释了很多。 – 2011-03-31 13:13:04

相关问题