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 に答える