2011-11-23 31 views
0

如果我使用NSAutoreleasePool,在池中創建的每個對象都不應該被手動釋放?當池被耗盡時它將被釋放?如何使用NSAutoreleasePool

- (void) backgroundRequest{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

     urlList = [[NSMutableArray alloc] init]; 
     target = [[NSMutableArray alloc] init]; 
     { 
    //do stuff in here 

    } 
    [urlList release]; 
    [target release]; 

    [pool release]; 
} 

是上述線路正確,或者我應該刪除[urlList release][target release]重要:我將等待解釋和答案。謝謝

回答

2

自動釋放池只有當你有對象使用Autorelease方法時才起作用。

如果您在使用本:

urlList = [[NSMutableArray alloc] init]; 

然後,你會想要做你自己的版本,是的。但是,如果你這樣做:

urlList = [[[NSMutableArray alloc] init] autorelease]; 

然後,你可以讓NSAutorelease池處理。

+0

UP投票,您的答案解決了我的應用程序崩潰問題,謝謝很多 –

0

我第二個來自@Brayden的答案。我想補充一點。 通常每個線程都有其自動釋放池。例如查看您的.main文件。它有一個與它關聯的自動釋放池。這樣你的主線程就有了一個autorelease池。 現在,當你產生另一個線程,即嘗試在另一個線程上運行一些方法,並且如果你將使用類方法進行通用初始化。

eg: NSString *strTem = [NSString stringWithString:AnotherString];

這樣就是自動釋放將被使用的情況下,對於這樣的函數(方法),你需要有自己的獨立的自動釋放池。

希望這可以幫助更多。

1

如果你不希望釋放urlListtarget,那麼你可以使用此代碼:

- (void) backgroundRequest 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

     urlList = [[[NSMutableArray alloc] init] autorelease]; 
     target = [[[NSMutableArray alloc] init] autorelease]; 
     { 
    //do stuff in here 

    } 

    [pool release]; 
} 

希望這有助於你。

問題是,AutoreleasePool處理那些已經使用關鍵字autorelease自動發佈的分配。因此,如果您使用該關鍵字,則不需要釋放它。它在AutoreleasePool發佈時發佈。

如果您需要更多信息,請在下面給我留言。

+0

如果我們正在進行autoreleasing,編寫池的需求是什麼。你能解釋一下嗎?在主線程上編寫autorelease池是不是很好。 (根據下面的嚴肅山姆)。 –

+0

@ArpitParekh:是的arpit它不是最好使用autorelease,但是因爲我們使用後臺任務,所以我們使用了autorelease池。還有,謝謝你指出錯誤的代碼。再次感謝 –

+0

嗨,親愛的,現在你編輯的代碼是不正確的。你以前的代碼是正確的。我擔心的是,爲什麼我們要在main方法上編寫autorelease池。你已經告訴了後臺任務。這是對的。謝謝 –