下载并使用ARC解压缩文件后出现内存警告

时间:2012-11-09 07:35:14

标签: objective-c ios memory-management automatic-ref-counting

我从服务器下载一些gzip压缩文件,将其保存到文档文件夹并解压缩每个文件。之后我删除了.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;
}

2 个答案:

答案 0 :(得分:2)

使用autorelease pool

包裹你的for循环内部
for (NSString* filePath in filePaths) {
    @autoreleasepool {
        // do work
    }
}

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

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

答案 1 :(得分:0)

使用AFNetworking 2.6.4和AFDownloadRequestOperation 2.0.1下载非常大的zip文件(5GB!)时,我遇到了类似的问题。我发现这样的内存问题是由Flipboard FLEX 2.1.1框架引起的。在我评论了[[FLEXManager sharedManager] setNetworkDebuggingEnabled:YES];行之后,它完全正常。