0

サーバーからいくつかのgzip圧縮されたxmlファイルをダウンロードし、それをドキュメントフォルダーに保存して、すべてのファイルを解凍します。その後、.gzファイルを削除します。私はそれを500ファイル程度のループで行います。機器を使用している場合、このプロセスの後、ライブバイトは多かれ少なかれ470MBであることがわかります。Imが数秒待つと、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

AFNetworking2.6.4 およびAFDownloadRequestOperation2.0.1を使用して非常に大きな zip ファイル (5 GB の!) をダウンロードするときに、同様の問題に直面しています。このようなメモリの問題は、Flipboard FLEX2.1.1 フレームワークが原因であることがわかりました。行をコメントアウトした後、[[FLEXManager sharedManager] setNetworkDebuggingEnabled:YES];完全に正常に動作します。

于 2016-02-17T03:12:40.043 に答える