NSURLSession下载任务使用默认会话配置在调试中增加内存

时间:2014-12-03 19:55:54

标签: ios nsurlsession nsurlsessiondownloadtask

我在iOS 7及更高版本上有一个使用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:)中,我只记录进度。

由于这在调试中运行,因此内存使用量会快速增加,而且数量已经下载了几倍。但是,如果我在后台任务中执行此操作,则内​​存使用量是不变的。

在下载任务中使用默认会话配置是不是很糟糕?我应该设置某种缓存属性吗?这里发生了什么?

更新:据我所知,这只有在附加调试器时才会发生。当我在没有调试器的模拟器中启动它时,我看不到活动监视器中的内存使用量增加。

更新2:这似乎已在iOS 8.3中修复。耶!

1 个答案:

答案 0 :(得分:0)

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

  1. 在iOS模拟器旁边打开活动监视器,转到内存选项卡,然后在搜索结果中输入您的应用程序名称。
  2. 通过xcode在模拟器中运行您的应用。等到您看到活动监视器中列出的进程,然后排队下载一两个。活动监视器将显示您的应用程序膨胀失控的内存使用情况。
  3. 停止在xcode中执行您的应用。在没有xcode的帮助下在模拟器中重新启动应用程序。等待您的应用再次出现在活动监视器中,并排队多下载。这次执行此操作时,应用程序的内存使用量应基本保持不变。
  4. 这对你来说是一个非常好的观察。我从来没有想过要研究这条道路。谢谢!