[英]iPhone - Memory Leak - NSData dataWithContentsOfUrl & UIWebView
[英]'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讓我大吃一驚:
我的問題是:
iOS 9.x中大約100 MB無效。 我怎樣才能讓他們回來? 有沒有解決方法?
iOS 8.x最多占用136.2 MB,而iOS 9.x最大使用225.9 MB。 為什么會這樣?
iOS 9.x中發生了什么?
我也嘗試過使用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仍然丟失。
以上測試使用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.