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

在此处查看潜在的解决方案。它使用 CFReadStream API。

祝你好运

蒂姆

于 2012-06-12T04:13:06.387 回答
-2

如果你想在一个新的线程中使用这个方法,你必须在方法的头部写下面的代码。

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

并将这段代码放在方法的末尾

[pool release];
于 2012-06-12T03:42:09.217 回答