iOS:NSFileHandle与NSOutputStream进行大文件下载

时间:2013-06-28 00:24:14

标签: ios objective-c download nsfilehandle nsoutputstream

在iOS上,我们的应用程序正在下载大约400MB的zip文件。在下载文件时,我们会出现间歇性崩溃。

当前我正在使用[NSFileHandle writeData:]来写入数据,而不是存储在内存中。但我想知道操作系统是否以某种方式将其存储在内存中?

NSOutputStream会成为下载大文件的更好解决方案吗?或者可能是标准的unix文件描述符?

我们的文件句柄设置如下:

NSFileManager * fileManager = [NSFileManager defaultManager];
[fileManager createFileAtPath:tmpFilePath.path contents:nil attributes:nil]; 
_zipFile = [NSFileHandle fileHandleForWritingAtPath:tmpFilePath.path];

目前我的NSURLConnection委托方法如下所示:

- (void) connection:(NSURLConnection *) connection didReceiveData:(NSData *) data {
   [_zipFile writeData:data];
}

因此,请求中的数据不会存储或附加到任何其他数据对象。这不应该写入磁盘而不影响内存吗?

由于

1 个答案:

答案 0 :(得分:4)

我认为您使用NSFileHandle时没有任何问题。我承认我一直使用NSOutputStream,但我只是尝试了两种方式(NSFileHandleNSOutputStream),并且两者在消耗的内存方面似乎都非常尊重。下载一个40mb的文件,分配在下载开始时飙升到3mb,但很快稳定在1mb):

allocations and leaks

所以,我会通过“Allocations”和“Leaks”运行你的应用程序(如果你选择“Leaks”,你会得到两者)并看看它是什么样的。

如果您还没有,请通过静态分析器运行代码(“产品”菜单上的“分析”),以确保您没有任何问题。 (你应该在那里有一个干净的健康状况;如果报告有任何问题,你必须修复它们。)我还要确保僵尸被关闭(因为在跟踪所有这些被释放的对象的过程中,它会为每个......创建一个僵尸对象,但它会消耗内存。