2011-11-17 222 views
0

我閱讀了關於NSAutoReleasePool的內容,並瞭解它使內存管理更容易在iPhone上進行。它在NSObject上可用,因此autorelease消息可用於每個對象實例。此外,我不應該使用autorelease很多,因爲NSAutoReleasePool使用緩存內存,如果有大量的自動釋放對象,你可能會跳出內存。我的理解是否正確?iPhone:關於NSAutoreleasePool的困惑

我不明白的一件事是明確創建NSAutoreleasePool的目的是什麼?這裏的目的是什麼?它是否像自動釋放imgData,img對象?因爲我可以看到這些對象不是以這種方法發佈的。

- (void)loadImage { 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
UIImage *img = [UIImage imageNamed: @"default_user.png"]; 
if(![[imgURL absoluteString] isEqualToString: @"0"]) { 
    NSData *imgData = [NSData dataWithContentsOfURL: imgURL]; 
    img = [UIImage imageWithData: imgData]; 
} 
if([target respondsToSelector: action]) 
    [target performSelectorOnMainThread: action withObject: img waitUntilDone: YES]; 
[pool release]; 
} 

謝謝。

回答

3

您可以使用本地自動釋放池來幫助減少峯值內存 佔用空間。當你的池被耗盡時,臨時對象是 發佈,這通常會導致它們的釋放,從而減少程序的內存佔用量。

我可以建議這個顯式自動釋放池是爲管理圖像加載而創建的。可能該圖像具有較大的尺寸(以Mb爲單位),並且該池可以保證內存將盡快釋放。所有的autorelease池都以堆棧方式組織,所以這個內部池將比主池更早耗盡。

+0

謝謝鈹。我現在很清楚! – applefreak

1

自動釋放背後的想法,以保持應用程序的內存使用率低。你會發現如果你還沒有使用這個自動發佈版本,那麼這些數據將會進入應用程序的主要自動發佈版。所以,即使你不再需要這個圖片,它仍然會留在內存中並增加它的佔用空間。創建一個新的自動發佈可以直接釋放內存(圖像的大小可能很大)。

+2

哈哈哈,'史蒂夫喬布斯'幫助'AppleDeveloper' ...好笑。 – LouwHopley

+1

autorelease對象不會「只有在應用程序終止後纔會釋放」。當沒有對象聲明所有權並且沒有被使用時,它將被釋放。我曾經有過一個bug,autorelease在我從對象中移除它時釋放了我的對象。但它並不完全可以預測,它似乎在線程不在你的代碼中時釋放,但是在我的錯誤中它被釋放,同時將它返回到另一個方法。 – Aberrant

+0

是的,你是對的,一旦你退出一個特定的循環,一些對象將被釋放。鈹已經非常清楚地解釋了我想說的話(對不起,我很困惑) –

0

規則是您必須在每個使用autorelease的線程中創建一個autorelease池。在你的例子中,img變量是自動釋放的,假設loadImage方法是線程化的,你必須在使用任何自動釋放內存之前聲明一個新的池。

+0

autorelease不僅用於線程..還有其他用途以及上面解釋。 –