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

Objective-C

Войти
Регистрация
Восстановить пароль
 
Ravenenok
1 / 1 / 0
Регистрация: 24.12.2010
Сообщений: 37
#1

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

08.09.2012, 14:01. Просмотров 946. Ответов 4
Метки нет (Все метки)

Кусок моей программы читает список файлов в папке и вычисляет хэш для каждого файла. Каждый файл помещается в 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
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2012, 14:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос NSData как освободить память (Objective-C):

Массив int8_t или NSData? - Objective-C
Кто что чаще используете? масив int8_t или NSData, вопрос не в том что правильно использовать))) а что чаще всего используете вы ?

Конвертация массива в NSData и обратно - Программирование iOS
Ребят, я тут с NSUserDefaults играюсь, и передо мной стоит задача. СОбрать спрайты со слоя, сохранить их в базе, и потом достать обратно....

Как освободить старые ImageVew чтобы освободить память - Программирование Android
Привет всем Я новичок поэтому прошу сильно не пинать. В общем мое первое приложение типа интернет магазин. Одно окно в котором...

как освободить память? - C++
Здравствуйте!!! Почему-то никак не освобождается память, выделенная оператором new под двумерный массив типа char,- как только идет...

Как освободить память? - C++
подскажите как правильно освободить память,спасибо заранее))) #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;string.h&gt; ...

Как правильно освободить память - C++
Здрасте! (Тема: Шаблоны функций.) Не могу правильно написать метод для освобождения памяти. В мейне делаю все необходимые мне...

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

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

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

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

Если будет файл 5Гб, значит будет 5Гб в памяти Я другого способа вычислить хэш не знаю.
0
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
08.09.2012, 21:32 #4
Ravenenok, конечно autorelease pool. Все верно. И не цикл, а то, что внутри цикла. Каждую итерацию.
0
Ravenenok
1 / 1 / 0
Регистрация: 24.12.2010
Сообщений: 37
11.09.2012, 10:22  [ТС] #5
Цитата Сообщение от zulkis Посмотреть сообщение
Ravenenok, конечно autorelease pool. Все верно. И не цикл, а то, что внутри цикла. Каждую итерацию.
Да, точно. Я в коде правильно написал, а тут ошибся.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2012, 10:22
Привет! Вот еще темы с ответами:

Как правильно освободить память - C++
Здравствуйте все! Подскажите, как правильно освобождать память, выделенную под массив оператором new? int *Arr = new int; ... delete...

Как освободить память быстро? - C++
Функция malloc неправильно работает...Заполняется память быстро,а очищается долго,с чем это связано,кто знает #include&lt;iostream&gt; ...

Как правильно освободить память - C++
Есть функция char* md5(const char*). Как освободить память выделенную ею? #include &lt;openssl\md5.h&gt; char* md5(const char* text) { ...

Как освободить виртуальную память? - Windows XP
какой прогой можно освободить виртуальную памать ? :)


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

Или воспользуйтесь поиском по форуму:
5
Yandex
Объявления
11.09.2012, 10:22
Ответ Создать тему
Опции темы

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