3

在 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];
}

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

谢谢

4

1 回答 1

4

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

分配和泄漏

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

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

于 2013-06-29T01:50:17.043 回答