2

我的程序的一部分读取目录,然后计算文件夹中每个文件的哈希值。每个文件都加载到内存中,我不知道如何释放它。我在这里阅读了很多主题,但找不到正确的答案。有人可以帮忙吗?

#import "MD5.h"
...

NSFileManager * fileMan = [[NSFileManager alloc] init];
NSArray * files = [fileMan subpathsOfDirectoryAtPath:fullPath error:nil];

if (files) 
{
  for(int index=0;index<files.count;index++) 
  {
    NSString * file = [files objectAtIndex:index];
    NSString * fullFileName = [fullPath stringByAppendingString:file];
    if( [[file pathExtension] compare: @"JPG"] == NSOrderedSame )
    {
      NSData * nsData = [NSData dataWithContentsOfFile:fullFileName];
      if (nsData)
      {
        [names addObject:[NSString stringWithString:[nsData MD5]]];
         NSLog(@"%@", [nsData MD5]);       
      }
    }
  }
}

和MD5.m

#import <CommonCrypto/CommonDigest.h>

@implementation NSData(MD5)

- (NSString*)MD5
{
    // Create byte array of unsigned chars
  unsigned char md5Buffer[CC_MD5_DIGEST_LENGTH];

    // Create 16 byte MD5 hash value, store in buffer
    CC_MD5(self.bytes, (uint)self.length, md5Buffer);

    // Convert unsigned char buffer to NSString of hex values
  NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
  for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) 
        [output appendFormat:@"%02x",md5Buffer[i]];

  return output;
}

@end
4

1 回答 1

9

如果您使用的是 ARC,那么数据将在最后一次引用消失后的某个时间点自动释放。在您的情况下,这将是它在 if 语句末尾超出范围时。

简而言之,您拥有的代码是可以的。

有一件事,创建数据对象时使用的一些内存可能保存在自动释放池中。在您回到事件循环之前,它不会消失。如果你将代码包装在一个@autoreleasepool { ... }块中,这个问题就会消失。

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html

于 2012-09-08T10:12:44.093 回答