Я новичок в xcode / cocoa и даже объективно-c, поэтому мой вопрос может быть глупым. Я пытаюсь написать программу, которая будет хэшировать файлы в папке. Я оглянулся и нашел способ загрузить файл через объект NSData, а затем хэшировать его байты с помощью CC_SHA512.
Если я пытаюсь хэшировать еще несколько файлов, я замечаю, что у меня заканчивается память. Используя Run -> Performance Tools, я мог бы точно определить мою проблему. Все объекты NSData, которые я создал, все еще находятся в памяти. Я пробовал авто-релиз и ручной релиз с помощью release / dealloc. Ничего не работает.
Мои настройки компилятора являются стандартными, за одним исключением, я выбираю Objective-C Сборка мусора = требуется
Может быть, кто-то может показать мне, что я делаю не так.
Вот код:
-(FileHash*) hashFileByName :(NSString*) filePath{
//NSData* inputData = [inputStr dataUsingEncoding:NSUTF8StringEncoding];
NSLog(filePath);
NSData* inputData = [[NSData dataWithContentsOfFile:filePath] autorelease];
unsigned char outputData[CC_SHA512_DIGEST_LENGTH];
CC_SHA512([inputData bytes], [inputData length], outputData);
NSMutableString* hashStr = [NSMutableString string];
int i = 0;
for (i = 0; i < CC_SHA512_DIGEST_LENGTH; ++i)
[hashStr appendFormat:@"%02x", outputData[i]];
//NSLog(@"%@ hash : %@",filePath,hashStr);
FileHash *hash = [[[FileHash alloc]init]autorelease];
[hash setFileHash:hashStr];
[hash setFilePath:filePath];
[inputdata release];
[inputdata dealloc];
return hash;
}
-(NSMutableArray*) hashFilesInDirectory:(NSString*) pathToDirectory:(Boolean) recursive : (IBOutlet id) Status : (Boolean*) BreakOperation{
NSGarbageCollector *collect = [NSGarbageCollector defaultCollector];
NSMutableArray *files;
files = [[self listFilesOnlyRecursive:pathToDirectory] autorelease];
NSMutableArray *hashes = [[[NSMutableArray alloc]init]autorelease];
for (NSString *file in files) {
[hashes addObject: [self hashFileByName:file]];
[collect collectExhaustively];
}
return hashes;
}
-(NSMutableArray*) listFilesOnlyRecursive : (NSString*) startDir {
NSMutableArray *filelist = [[[NSMutableArray alloc] init]autorelease];
//Inhalt eines Verzeichnisses auflisten (unterverzeichnisse werden ignoriert
NSFileManager *manager = [[NSFileManager defaultManager]autorelease];
NSDirectoryEnumerator *enumerator = [manager enumeratorAtPath:startDir];
int count = 0;
id file;
while (file = [enumerator nextObject])
{
// file = [[[[startDir stringByAppendingString:@"/"]autorelease] stringByAppendingString:file] autorelease
// ];
file = [NSString stringWithFormat:@"%@/%@",startDir,file];
BOOL isDirectory=NO;
[[NSFileManager defaultManager] fileExistsAtPath:file isDirectory:&isDirectory];
if (!isDirectory){
[filelist addObject:file];
//printf("\n:%s:\n",[file UTF8String]);
count++;
}
}
NSLog(@"Es waren %i files",count);
return filelist;
}
Все это запускается
int main(int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//return NSApplicationMain(argc, (const char **) argv);
MemoryLeakTest *test = [[[MemoryLeakTest alloc]init]autorelease];
[test hashFilesInDirectory:@"/huge directory/" :YES :nil :nil];
[pool drain];
[pool release];
[pool dealloc];
}
Может быть, у кого-то есть идея.
Чем Вы заранее :)
Nubus