2014-12-03 85 views
2

我有一款應用程序,可在iOS 7及更高版本上使用NSURLSession下載文件。我開始的任務是這樣的:NSURLSession下載任務通過默認會話配置調試時增加內存

//property declared: @property (retain) NSURLSession *session; 

NSString *addr = @"http://www.example.com/path/to/nontrivial/file.dat"; 
NSURL *url = [NSURL URLWithString:addr]; 
NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; 
self.session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil]; 
[[self.session downloadTaskWithRequest:request] resume]; 

在完成處理器(URLSession:downloadTask:didFinishDownloadingToURL:),我將文件移動到我的應用程序數據文件夾,並在會議上呼籲invalidateAndCancel。在進度處理程序(didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)中,我只記錄進度。

由於這是在調試中運行,所以內存使用量迅速增加,達到下載數據量的幾倍。但是,如果我在後臺任務中執行此操作,則內​​存使用量將保持不變。

對下載任務使用默認會話配置不好嗎?是否有某種緩存屬性,我應該設置?這裏發生了什麼?

更新:據我所知,這隻發生在調試器連接時。當我在沒有調試器的模擬器中啓動它時,Activity Monitor中看不到任何內存使用量增加。

更新2:這似乎已在iOS 8.3中修復。好極了!

+0

我面臨同樣的問題。我深入研究了一下,發現內存使用情況(通過在設備上調用host_statistics報告)實際上並沒有增加。看來,無論是向Xcode /報告內存使用情況,還是負責處理內存消耗的進程都會中斷。 – Ahti 2015-02-05 17:33:31

+0

@Ahti - 真棒。時間提交雷達。 – 2015-02-05 17:35:27

回答

0

這同樣的行爲發生在我身上。當內存變得枯竭時,它通過硬崩潰來表現自己。對於其他人,如果他們看到同樣的問題誰是好奇,請按照下列步驟......

  1. 打開活動監視器旁邊的的iOS模擬器,轉到內存選項卡,並在搜索結果中輸入您的應用程序的名稱。
  2. 通過xcode在模擬器中運行您的應用程序。等到看到活動監視器中列出的進程,然後排隊等待下載或兩個。活動監視器將顯示您的應用膨脹失控的內存使用情況。
  3. 停止在xcode中執行您的應用程序。無需藉助xcode即可在模擬器中重新啓動應用程序。等待你的應用程序再次出現在活動監視器中,並排隊多下載。當你這樣做時,你的應用程序的內存使用應該基本保持不變。

這對你來說非常棒。我從未想過要調查這條道路。謝謝!

+0

它出現在iOS 8.3中。 – 2015-04-21 21:47:46

相關問題