NSData可用内存

时间:2012-09-08 09:43:47

标签: objective-c nsdata

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

#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

1 个答案:

答案 0 :(得分:9)

如果您正在使用ARC,那么数据将在最后一次引用后的某个时刻自动解除分配。在你的情况下,这将是它在if语句结束时超出范围。

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

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

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