當你說你不能觸摸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池。
對不起,我應該告訴你更多的細節。我正在使用Mac,而不是iOS。我有我自己的事件循環,我可以創建一個NSAutoreleasePool。但在我調用MacEventLoop :: run()之前會使用MacFontEngine(MacEventLoop是我自己的事件循環)。這就是我提出這個想法的方式,MacGuiEngine,MacFontEngine等應該在那裏保留一個自動釋放池。 – Schwitzgabel 2011-03-30 21:49:33
好的,所以你正在構建一個圍繞可可的C++包裝,我猜測?是的,我也創建了其中的一個....沒有明智的方法來給每個對象自己的autoreleasepool。池在棧上生存,並且對於給定的線程,在任何時候都只有一個全局活動,並且它們需要定期銷燬以釋放內存。當從C++調用到ObjC中時,必須包裝你的public(可以從C++調用)方法,如上面在someMethod中所示。一定要閱讀'NSAutoreleasePool'上的文檔。它解釋了很多。 – 2011-03-31 13:13:04