1

ファイルのダウンロード後に MD5 を確認する方法をいくつか使用しました。しかし、あまりにも多くのファイル md5 をチェックすると、常にメモリ警告またはメモリ不足によるクラッシュが発生するようです。誰かがこれに対する良い解決策を持っていますか?

Joel's Writings のMD5 をチェックする方法と、他の投稿の他の方法を使用しましたが、すべて問題を解決できませんでした。

NSInteger index = 0;

    while (downloadQueue.count > 0) {

        NSLog(@"%i files need to download.", downloadQueue.count);
        NSLog(@"00: %u", [MenChecker get_free_memory]);

        @autoreleasepool {

            NSString *src = [downloadQueue objectAtIndex:index];
            NSString *path = [self.storageRoot stringByAppendingPathComponent:[storageList objectAtIndex:index]];
            NSString *md5 = [md5CheckList objectAtIndex:index];

            BOOL isExist = [[NSFileManager defaultManager] fileExistsAtPath:path];
            if (isExist) {

                NSString *md5OfData = nil;

                CFStringRef fileMD5Hash = FileMD5HashCreateWithPath((__bridge CFStringRef)path, FileHashDefaultChunkSizeForReadingData);
                if (fileMD5Hash) {

                    md5OfData = (__bridge NSString *)fileMD5Hash;
                    CFRelease(fileMD5Hash);
                }

                if ([md5OfData isEqualToString:md5]) {

                    [downloadQueue removeObjectAtIndex:index];
                    [storageList removeObjectAtIndex:index];
                    [md5CheckList removeObjectAtIndex:index];
                }
                else {

                    [[NSFileManager defaultManager] removeItemAtPath:path error:nil];

                    ASIHTTPRequest *request_cover = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:src]];
                    [request_cover setDownloadDestinationPath:path];
                    [request_cover startSynchronous];

                    NSString *md5OfDataFile = nil;
                    CFStringRef dataFileMD5Hash = FileMD5HashCreateWithPath((__bridge CFStringRef)path, FileHashDefaultChunkSizeForReadingData);
                    if (dataFileMD5Hash) {

                        md5OfDataFile = (__bridge NSString *)dataFileMD5Hash;
                        CFRelease(dataFileMD5Hash);
                    }

                    if ([[NSFileManager defaultManager] fileExistsAtPath:path] && [md5OfDataFile isEqualToString:md5]) {

                        [downloadQueue removeObjectAtIndex:index];
                        [storageList removeObjectAtIndex:index];
                        [md5CheckList removeObjectAtIndex:index];
                    }
                    else {

                        index ++;
                    }
                    md5OfDataFile = nil;
                }
                md5OfData = nil;
            }
            else {

                NSString *directory = [path stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"/%@", [path lastPathComponent]] withString:@""];
                [[NSFileManager defaultManager] createDirectoryAtPath:directory withIntermediateDirectories:YES attributes:nil error:nil];

                ASIHTTPRequest *request_cover = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:src]];
                [request_cover setDownloadDestinationPath:path];
                [request_cover startSynchronous];
                request_cover = nil;

                NSString *md5OfData = nil;
                CFStringRef fileMD5Hash = FileMD5HashCreateWithPath((__bridge CFStringRef)path, FileHashDefaultChunkSizeForReadingData);
                if (fileMD5Hash) {

                    md5OfData = (__bridge NSString *)fileMD5Hash;
                    CFRelease(fileMD5Hash);
                }

                if ([[NSFileManager defaultManager] fileExistsAtPath:path] && [md5OfData isEqualToString:md5]) {

                    [downloadQueue removeObjectAtIndex:index];
                    [storageList removeObjectAtIndex:index];
                    [md5CheckList removeObjectAtIndex:index];
                }
                else {

                    index ++;
                }
                md5OfData = nil;
            }

            if (index >= downloadQueue.count) {

                index = 0;
            }
        }
4

0 に答える 0