2011-03-30 70 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

相關問題