2013-07-21 37 views
0

我對Obj-C相當陌生,剛開始做一些無用的程序來幫助我進一步提高知識水平。我想確保我沒有發生任何內存泄漏。程序結束時,'@autoreleasepool'中的任何內容是否會自動釋放內存?Objective-C @autoreleasepool?

另外,如果有任何不良習慣,請讓我知道!

int main(int argc, const char * argv[]) 
{ 
    @autoreleasepool { 

     Fraction* fractionOne = [[Fraction alloc]init]; 
     Fraction* fractionTwo = [[Fraction alloc]init]; 
     Fraction* fractionThree = [[Fraction alloc]init]; 

     [fractionOne setTo:1 over:2]; 
     [fractionTwo setTo:1 over:4]; 
     [fractionThree setTo:1 over:8]; 

     [Fraction numberOfFractions]; 

    return 0; 
    } 
} 

回答

0

這或多或少是它所做的。但不要擔心:只需依靠ARC。它爲你管理你的記憶!

使用ARC,你真正看到的唯一的地方是@autoreleasepool是主要功能。當你開始製作應用時,你會在別處編寫代碼,幾乎不會編輯「默認」main函數(由Xcode模板提供給你)。

所以不要擔心!你的代碼很好:)

+1

不,這只是我製作類方法的一種方法。它記錄分數對象的數量。感謝您的迴應! – user2350763

+0

ARC不會「爲你管理你的內存」,並且認爲這可能導致難以調試內存泄漏/崩潰。 –

+0

你管理它的程度是通過使用「= nil」(並且一般考慮內存),但我的意思是你不能明確地釋放內存。作爲初學者,不要太擔心記憶。當你開始製作應用程序時,你必須要做的最大的事情就是擔心是否要做強/弱的屬性參考。我讓ARC做這件事,到目前爲止我沒有遇到任何問題。 – Macro206

0

在ARC打開的情況下,編譯時會添加代碼以明確釋放fractionOne,Two和Three,因此它們將與ARC一起發佈。如果沒有ARC,alloc會創建Fraction的保留實例,並且您的代碼沒有明確地發佈(幾乎總是更好),或者將它們設置爲autoreleased(幾乎總是更糟糕)。

因此,如果沒有電弧,您在運行該程序的幾毫秒內就會漏水。

+0

好的,所以@autoreleasepool僅在ARC打開時纔可用?假設我沒有這樣做,我將如何釋放內存?即使ARC打開,仍可以釋放它嗎? – user2350763

+1

當您像以前一樣聲明它時,它處於打開狀態,但在ARC處理代碼時不會使用太多。隨着ARC,你不會做明確的釋放,autorelease。編譯器不會讓你。 – danh

3

請參閱「高級內存管理編程指南」中關於Using Autorelease Pool Blocks的Apple討論。

總之,沒有,它不是「在任何@autoreleasepool自動釋放時程序結束[s]的其存儲器」(或至少不作爲@autoreleasepool的函數)的情況。擁有自動釋放池的目的是控制何時從自動釋放項目回收內存,即何時池將被排空。但是你的代碼示例似乎沒有使用任何自動發佈的項目,所以它在這裏並不適用(除非這些方法在內部使用autorelease對象)。

autorelease池最常見的用法是減少應用程序的內存高水位標記。見Use Local Autorelease Pool Blocks to Reduce Peak Memory Footprint。它曾經是used for thread programming,但是現在我們已經有了操作和調度塊,我們不必再編寫傳統的線程代碼了,所以我們沒有太多機會在​​我們的多線程代碼中需要單獨的自動釋放池。