Форум программистов, компьютерный форум CyberForum.ru

NSData как освободить память - Objective-C

Восстановить пароль Регистрация
 
Ravenenok
1 / 1 / 0
Регистрация: 24.12.2010
Сообщений: 37
08.09.2012, 14:01     NSData как освободить память #1
Кусок моей программы читает список файлов в папке и вычисляет хэш для каждого файла. Каждый файл помещается в NSData, что приводит к увеличению используемой памяти ровно на размер файлов, т.е. если у меня в папке будет 1Гб файлов, то память, требуемая программе тоже увеличится на 1Гб, release и dealloc не работают, т.к. включен ARC, есть варианты как это побороть?



C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#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

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2012, 14:01     NSData как освободить память
Посмотрите здесь:

Objective-C Память
Массив int8_t или NSData? Objective-C
Objective-C Не освобождается память после unwind segue

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vorona
Peace 2 all shining faces
 Аватар для Vorona
661 / 523 / 44
Регистрация: 05.03.2010
Сообщений: 1,267
08.09.2012, 14:12     NSData как освободить память #2
можно
выключить ARC и ручками управлять,
либо "NSData * nsData" из 15 строки вынести за пределы цикла, тогда просто будет один и тот же nsData для всех файлов переопределяться каждый раз

2 способ более оптимальный и логичный
p.s. а что если файл будет весить 5гб?
Ravenenok
1 / 1 / 0
Регистрация: 24.12.2010
Сообщений: 37
08.09.2012, 16:01  [ТС]     NSData как освободить память #3
Цитата Сообщение от Vorona Посмотреть сообщение
можно
выключить ARC и ручками управлять,
либо "NSData * nsData" из 15 строки вынести за пределы цикла, тогда просто будет один и тот же nsData для всех файлов переопределяться каждый раз

2 способ более оптимальный и логичный
p.s. а что если файл будет весить 5гб?
Я нашел решение, нужно было цикл в @autorelease {} обернуть.

Даже если вынести NSData за пределы цикла ничего не изменится, пробовал.

Если будет файл 5Гб, значит будет 5Гб в памяти Я другого способа вычислить хэш не знаю.
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
08.09.2012, 21:32     NSData как освободить память #4
Ravenenok, конечно autorelease pool. Все верно. И не цикл, а то, что внутри цикла. Каждую итерацию.
Ravenenok
1 / 1 / 0
Регистрация: 24.12.2010
Сообщений: 37
11.09.2012, 10:22  [ТС]     NSData как освободить память #5
Цитата Сообщение от zulkis Посмотреть сообщение
Ravenenok, конечно autorelease pool. Все верно. И не цикл, а то, что внутри цикла. Каждую итерацию.
Да, точно. Я в коде правильно написал, а тут ошибся.
Yandex
Объявления
11.09.2012, 10:22     NSData как освободить память
Ответ Создать тему
Опции темы

Текущее время: 15:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru