0

我从服务器下载了一些 gzipped xml 文件,将其保存到文档文件夹并解压缩每个文件。之后我删除 .gz 文件。我对或多或少的 500 个文件循环执行此操作。当我使用仪器时,我看到在这个过程之后实时字节或多或少是 470MB。当我等待几秒钟时,ARC 将其清除,应用程序将使用 5mb 活动字节。但是因为它是一个同步过程,所以当我在下载和解压缩后没有停止时,我的应用程序会立即收到内存警告。至少我认为应该可以强制ARC释放内存?还是我有一个真正糟糕的代码,但我仍然没有看到?

非常感谢任何帮助或提示。

下载和解压:

for(NSString *filePath in filePaths){
    NSString *localPath = [[DownloadManager sharedInstance] downloadFile:filePath];
    if(localPath){
        //downloaded correctly
        if([self unzipFileAtPath:localPath]){
            [FileUtility deleteFileAtPath:localPath];
        }
    }
}

解压方法:

+ (BOOL)unzipFileAtPath:(NSString *)path
{
    NSData *gzData = [NSData dataWithContentsOfFile:path];
    NSData *ungzippedData = [gzData gunzippedData];

    BOOL success = [ungzippedData writeToFile:[FormatUtility pathWithoutGz:path] atomically:NO];
    ungzippedData = nil;
    gzData = nil;

    return success;
}
4

2 回答 2

2

用自动释放池包裹你的 for 循环内部:

for (NSString* filePath in filePaths) {
    @autoreleasepool {
        // do work
    }
}

这个问题实际上与ARC无关。类似的方法dataWithContentsOfFile:将返回一个新的自动释放对象实例。在封闭的自动释放池耗尽之前,这些对象不会被释放,默认情况下,这只发生在线程/操作结束或返回运行循环时。

当您在循环中分配许多临时对象时,就像您正在做的那样,您应该使用自己的自动释放池来确保这些临时对象不会不必要地累积。

于 2012-11-09T07:48:13.580 回答
0

AFNetworking使用2.6.4 和AFDownloadRequestOperation2.0.1下载非常大的 zip 文件(5GB!)时,我遇到了类似的问题。我发现这种内存问题是由 Flipboard FLEX2.1.1 框架引起的。在我注释掉这条线后[[FLEXManager sharedManager] setNetworkDebuggingEnabled:YES];,它工作得很好。

于 2016-02-17T03:12:40.043 回答