2013-02-03 35 views
45

可能重複:
Why use Autorelease pool?什麼是autoreleasepool?

所有Objective-C的起始頁面與主函數聲明下一個默認@autoreleasepool{...}語句打開。但是這個聲明實際上在做什麼?新的Objective-C自動釋放對象並刪除行對程序沒有任何影響。這個命令真的有必要嗎?

+0

或許http://stackoverflow.com/questions/8714875/why-does-xcode-4-2-use-autoreleasepool-in-main-m-instead-of-nsautoreleasepool –

回答

71

@autoreleasepool聲明與以前一樣執行相同的工作,而不是使用NSAutoreleasePool類。 NSAutoreleasePool的工作方式有點奇怪,因爲創建它會在整個應用程序中產生效果; @autoreleasepool創建一個有作用域的區域,並使其更清楚池中的內容以及何時消耗(當它超出範圍時)。根據蘋果的說法,它也更有效率。

自動釋放池的概念非常簡單,只要對象實例標記爲自動釋放(例如NSString* str = [[[NSString alloc] initWithString:@"hello"] autorelease];),它在該時刻的保留計數就是+1,但是在運行循環結束時,該池被排空,並且任何標記爲autorelease的對象的保留計數遞減。這是一種在你準備任何可以保留它自己的東西時保持物體的一種方式。

使用ARC,開發人員不使用autorelease關鍵字,管理ARC的基礎系統會爲您插入該關鍵字。 (記住:所有ARC正在插入retainreleaseautorelease在適當的時間要求您)。正因爲如此,現有的AutoreleasePool概念需要停留在周圍。

如果刪除了自動釋放池,你的對象將開始泄漏

在引用計數的環境,可可希望那裏是一個自動釋放池始終可用。如果池不可用,則自動釋放的對象不會釋放,並且會泄漏內存。在這種情況下,您的程序通常會記錄適當的警告消息。

+0

這是否意味着,如果我使用ARC並從''@autoreleasepool {}之外的某處釋放對象,該對象仍然存在,直到@autoreleasepool塊的結尾? – confile

+2

如果您手動釋放自動釋放對象,則當您點擊自動釋放池的末尾時,釋放的對象將不再存在,並且您可能會在框架或機器代碼中的某處發生異常。如果這是一段漫長的代碼,你的應用程序似乎會在一個看似無關的位置崩潰,造成混亂。 – jcpennypincher