3

我正在爲我的OS X應用程序重構ARC。打開main.m文件,我確信我會找到Autorelease Pool的實例化和流失(像iOS項目),但令我驚訝的是它不在那裏。創建和排空OS X應用程序的自動釋放池在哪裏?

所以我的第一個問題是:

  • 哪裏是主要的自動釋放池?

我的下一個問題是:

  • 如果沒有創建主自動釋放池,我需要創建它?還是自動釋放的對象以某種自動方式釋放?

回答

5

你main.m文件應具有以下電話:

NSApplicationMain(argc, (const char **)argv); 

NSApplicationMain()負責創建應用程序,即,NSApplication一個實例,這又是負責創建自動釋放池:

NSApplication類在初始化期間和事件循環內設置自動釋放池(NSAutoreleasePool類的實例) - 特別是在其初始化(或共享應用程序)並運行方法。

這意味着,在一般情況下,你不應該擔心,因爲NSApplication創建自動釋放池已經這樣做,在這兩種初始化和事件循環。在某些情況下,創建自己的自動釋放池可能是必要/可取的,例如一個具有創建許多自動釋放對象的循環的方法。在這種情況下,爲每個循環迭代設置一個自動釋放池是一個好主意。

+1

我有NSString * a = [NSString string];在主函數中的線,我越來越*** __NSAutoreleaseNoPool():對象0x7fff703fd190類NSCFString autoreleased沒有到位的地方 - 泄漏爲什麼? –

+0

@Parag如果你在'main()'中這樣做,那麼你不調用(或者還沒有調用)'NSApplicationMain()',而NSApplicationMain()不會創建'NSApplication',它會創建autorelease自動彙集。如果你不使用'NSApplication',你需要創建你自己的autorelease池。 – 2011-11-17 09:20:53

+0

return NSApplicationMain(argc,(const char **)argv);語句也在我的main()function.int main(int argc,char * argv []) { \t NSString * a = [NSString string]; return NSApplicationMain(argc,(const char **)argv); } –

1

與往常一樣,Apple的文檔中涵蓋了這個主題。例如,請查看主要功能中發生了什麼this Cocoa Fundamentals Guide chapter部分。引述部分有關這個問題(已經被Bavarious解釋):

在幾乎所有的Cocoa應用程序的主要功能是極其 簡單。在Mac OS X中,它只包含一個函數調用。

#import <AppKit/AppKit.h> 

int main(int argc, const char *argv[]) { 
    return NSApplicationMain(argc, argv); 
} 

NSApplicationMain功能創建應用程序 對象,設置了一個自動釋放池,裝載來自主筆尖文件的初始用戶界面 ,並且運行該應用程序,從而請求 它開始處理在主事件循環中收到的事件。

相關問題