簡體   English   中英

'NSData dataWithContentsOfURL:'內存泄漏iOS 9.x?

[英]'NSData dataWithContentsOfURL:' memory leak iOS 9.x?

我的代碼如下:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSString *theURLString = @"http://website.com/musicFile";
    NSData *theData = [NSData dataWithContentsOfURL:[NSURL URLWithString:theURLString]];
}

沒什么特別的。 我甚至沒有使用后台線程。

這是我在iOS 8.x上獲得的行為(以及我期望得到的行為):

在此輸入圖像描述

因此,NSData完全釋放,所有占用的內存都恢復了。

但是,iOS 9.x讓我大吃一驚:

在此輸入圖像描述

我的問題是:

  1. iOS 9.x中大約100 MB無效。 我怎樣才能讓他們回來? 有沒有解決方法?

  2. iOS 8.x最多占用136.2 MB,而iOS 9.x最大使用225.9 MB。 為什么會這樣?

  3. iOS 9.x中發生了什么?

更新#1:

我也嘗試過使用NSURLSession'dataTaskWithURL:completionHandler:'(感謝@CouchDeveloper)。 這減少了泄漏,但沒有完全解決問題(這次是iOS 8.x和iOS 9.x)。

我使用下面的代碼:

NSURLSession *theURLSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSURLSessionDataTask *theURLSessionDataTask = [theURLSession dataTaskWithURL:[NSURL URLWithString:theURLString]
                                                               completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)
                                                   {
                                                       NSLog(@"done");
                                                   }];
[theURLSessionDataTask resume];

在此輸入圖像描述

如您所見,30 MB仍然丟失。

更新#2:

以上測試使用Xcode模擬器完成。

但是,我還決定測試實際的iOS 9.2 iPhone 4S(由@Sohil R. Memon推薦)。

'NSData dataWithContentsOfURL:'的結果如下:

在此輸入圖像描述

使用'NSURLSession dataTaskWithURL:completionHandler:'的結果如下:

在此輸入圖像描述

它看起來像'NSData dataWithContentsOfURL:'在實際設備上完美運行,而'NSURLSession dataTaskWithURL:completionHandler:' - 則不然。

但是,有沒有人知道在實際設備和Xcode模擬器上顯示相同信息的解決方案?

iOS 9.x中大約100 MB無效。 我怎樣才能讓他們回來? 有沒有解決方法?

出於幾個原因,我們應該使用NSURLSession從Web服務下載數據。 所以,這不是一種解決方法,而是正確的方法。

iOS 9.x中發生了什么?

我不知道 - 可能是緩存數據,網絡緩沖區或其他一些問題。 但這是無關緊要的 - 您應該嘗試使用NSURLSession的正確方法。

來自文檔

重要

請勿使用此同步方法來請求基於網絡的URL。 對於基於網絡的URL,此方法可以在慢速網絡上阻止當前線程數十秒,從而導致用戶體驗不佳,而在iOS中,可能會導致應用程序被終止。

相反,對於非文件URL,請考慮使用NSURLSession類的dataTaskWithURL:completionHandler:方法。 有關詳細信息,請參閱URL會話編程指

編輯:

那些“理由”是:

  • NSURLSession專門用於加載遠程資源。

  • NSURLSession方法是異步的 ,這對於僅在可感知的持續時間之后完成的方法(它不會阻塞調用線程)是至關重要的。

  • 會話可以通過默認方法或自定義委托來處理身份驗證。

  • 會話任務可以取消。

也是一個幫助我的答案。 答案說明使用[NSData dataWithContentsOfURL:url options:0 error:&error]; 代替。

希望這可以幫助

暫無
暫無

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

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