【问题标题】:Memory warning after downloading and unzip files with ARC使用 ARC 下载和解压缩文件后出现内存警告
【发布时间】:2023-03-29 06:18:01
【问题描述】:

我正在从服务器下载一些 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;
}

【问题讨论】:

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


    【解决方案1】:

    autorelease pool 包裹你的 for 循环内部:

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

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

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

    【讨论】:

    • 我稍后会尝试并给您反馈。听起来不错,可能是我搜索的东西,谢谢!
    • 这就是解决方案!非常感谢。
    • @Darren 这也是解决方案吗? stackoverflow.com/questions/19159932/…
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 2014-12-24
      • 2021-09-27
      • 1970-01-01
      相关资源
      最近更新 更多