簡體   English   中英

iPhone:關於NSAutoreleasePool的困惑

[英]iPhone: Confusion about NSAutoreleasePool

我閱讀了有關NSAutoReleasePool的信息,並了解它使iPhone上的內存管理更加容易。 它在NSObject上可用,因此自動釋放消息可用於每個對象實例。 而且,我不應該過多地使用自動釋放,因為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];
}

謝謝。

您可以使用本地自動釋放池來幫助減少峰值內存占用。 當池耗盡時,將釋放臨時對象,這通常會導致它們的重新分配,從而減少程序的內存占用量。

我可以建議創建此顯式自動釋放池來管理圖像加載。 圖像可能很大(以Mb為單位),並且該池可以保證內存將盡快釋放。 所有自動釋放池按堆棧組織,因此該內部池將比主池更早耗盡。

自動發布背后的想法是保持應用程序的內存使用率較低。 您會看到是否尚未使用此自動發布,則該數據將進入應用程序的主要自動發布,因此,即使您不再需要該映像,它仍會保留在內存中並增加其占用空間。 創建新的自動發布會立即釋放內存(圖像的大小可能很大。)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM