2

我有一个应用程序可以NSURLSession在 iOS 7 及更高版本上下载文件。我开始这样的任务:

//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 中修复。耶!

4

1 回答 1

0

同样的行为也发生在我身上。当内存耗尽时,它通过硬崩溃表现出来。对于其他好奇他们是否遇到同样问题的人,请按照以下步骤操作...

  1. 打开 iOS 模拟器旁边的活动监视器,转到内存选项卡并在搜索结果中输入您的应用程序名称。
  2. 通过 xcode 在模拟器中运行您的应用程序。等到您看到活动监视器中列出的进程,然后排队下载一两个。活动监视器将显示您的应用程序膨胀失控的内存使用情况。
  3. 停止在 xcode 中执行您的应用程序。在没有 xcode 的帮助下在模拟器中重新启动应用程序。等待您的应用再次出现在活动监视器中,然后再排队下载一些。当你这次这样做时,你的应用程序的内存使用量应该基本保持不变。

这对你来说是一个非常好的观察。我从没想过要调查这条路。谢谢!

于 2015-03-04T23:18:09.853 回答