以下代码中是否有任何内存泄漏?

时间:2012-06-12 03:14:57

标签: iphone objective-c cocoa-touch cocoa md5

如果我计算一个大于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;
}

2 个答案:

答案 0 :(得分:0)

查看可能的解决方案here。它使用CFReadStream API。

祝你好运

答案 1 :(得分:-2)

如果要在新线程中使用此方法,则必须在方法的开头编写以下代码。

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

并将此代码放在方法的末尾

[pool release];