0

200Mbを超えるファイルのMD5値を計算すると、アプリは大量のメモリを高速化してクラッシュします。次のコードにメモリリークはありますか?巨大なビデオファイルのMD5値を計算するためのより良い方法はありますか?

+ (NSString *) md5ForFileContent:(NSString *)path
{

    NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:path];
    if (handle == nil) {
        return nil;
    }
    CC_MD5_CTX md5;
    CC_MD5_Init (&md5);

    BOOL done = NO;

    while (!done) {

        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        NSData *fileData = [[NSData alloc] initWithData: [handle readDataOfLength:1024]];
        CC_MD5_Update (&md5, [fileData bytes], [fileData length]);

        if ([fileData length] == 0) {
                done = YES;
        }

        [fileData release];
        [pool release];

    }

    unsigned char digest[CC_MD5_DIGEST_LENGTH];
    CC_MD5_Final (digest, &md5);

    NSString *s = [NSString stringWithFormat: @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
               digest[0],  digest[1], 
               digest[2],  digest[3],
               digest[4],  digest[5],
               digest[6],  digest[7],
               digest[8],  digest[9],
               digest[10], digest[11],
               digest[12], digest[13],
               digest[14], digest[15]];
    return s;
}
4

2 に答える 2

0

ここで潜在的な解決策を確認してください。CFReadStreamAPIを使用します。

幸運を

ティム

于 2012-06-12T04:13:06.387 に答える
-2

このメソッドを新しいスレッドで使用する場合は、メソッドの先頭に次のコードを記述する必要があります。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

そして、このコードをメソッドの最後に置きます

[pool release];
于 2012-06-12T03:42:09.217 に答える