簡體   English   中英

NSURLConnection在下載大部分數據時導致內存警告

[英]NSURLConnection causing memory warning while downloading large portion of data

我在iOS(5.1,6.0,6.1)上遇到了NSURLConnection令人不安的問題。
當我嘗試通過http請求下載大部分數據時,我的應用程序並未將發布的數據標記為真正發布(稍后我會解釋)。

我的下載代碼如下所示:

NSURL *url = [NSURL URLWithString:@"http://my.server/file.zip"];  
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];  
NSURLConnection *urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];  
[urlConnection start];

代表是我的視圖控制器。
在主runloop上調用此代碼(沒有調度隊列或執行這樣的選擇器)。
代表對所收到的數據絕對不做 - 沒有保留,沒有復制 - 什么都沒有。

問題是,當我使用新創建的項目調用此代碼時 - 它表現良好 - 下載所有數據並完成而沒有任何問題。

但是當在我的其他應用程序中調用代碼時,突然所有下載的數據都會在應用程序中留下內存空間,一段時間后內存耗盡,應用程序會收到內存警告並崩潰。

您可能會說 - 您的委托保留數據但不會釋放它。 好吧,我試着用儀器找到解決方案。 猜猜是什么 - 我的應用程序在分配時顯示它在下載資源時保持大約10 mb的內存! 在Allocations或VM Tracker上都沒有顯示任何內容。

那么我怎么知道應用程序會保留下載數據的內存空間?

這是向我展示我的記憶報告的代碼(在本網站的某些答案中較早發現 - 現在無法找到它:

    -(void) report_memory {  
       struct task_basic_info info;  
       mach_msg_type_number_t size = sizeof(info);  
       kern_return_t kerr = task_info(mach_task_self(),
                                      TASK_BASIC_INFO,
                                      (task_info_t)&info,
                                      &size);  
       if( kerr == KERN_SUCCESS ) {  
          STLog(ST_DEBUG, @"Memory in use (in bytes): %u b ( %u mb )", info.resident_size, info.resident_size / (1024 * 1024) );  
       } else {  
          STLog(ST_DEBUG, @"Error with task_info(): %s", mach_error_string(kerr));  
       }  
   }

我的問題是 - 這里發生了什么?
為什么該應用程序會顯示一些內存占用?
為什么儀器沒有過多的分配?
NSURLConnection可能導致過度分配的原因是什么?

PS。 我還嘗試更改磁盤上的共享緩存大小,在內存中,使用其他緩存策略 - 沒有任何幫助:(

事實證明,當使用僵屍對象時,NSURLConnection會保留釋放的對象。 這可以防止它們完全解除分配 - 從而導致內存占用。

解決方案是在通過NSURLConnection下載大部分數據時不使用僵屍對象。

暫無
暫無

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

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