У меня есть программа, которая читает огромный текстовый файл (строка за строкой) и выполняет некоторые строковые операции с каждой строкой перед записью строки в базу данных.
Программе требовалось все больше и больше памяти, поэтому я решил, что мне может понадобиться освободить строки, которые я использую. Но это не помогло. Поэтому я собрал следующий код, чтобы проверить, что на самом деле происходит. Некоторым методом проб и ошибок я обнаружил, что когда я делаю сток в пуле авто-релиза, он работает.
Я хотел бы знать, что я делаю. Поэтому я спрашиваю:
- Почему релиз не освобождает память?
- Есть ли лучший способ сделать это?
Вот моя тестовая программа
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int cnt = 0;
while (cnt < 1000000000) {
NSMutableString *teststr = [[NSMutableString alloc] init];
teststr = [NSString stringWithString:@"Dummy string just for the demo"];
cnt++;
if (cnt % 1000000 == 0) {
printf("cnt=%i\n",cnt);
}
[teststr release];
// [pool drain]; // It works when I do this
// [[NSAutoreleasePool alloc] init]; // and this
}
[pool drain];
return 0;
}
РЕДАКТИРОВАТЬ: Основываясь на ответах до сих пор, я посмотрел на свою оригинальную программу и изменил программу испытаний:
//teststr = [NSString stringWithString:@"Dummy string just for the demo"];
[teststr appendString:@"Dummy string just for the demo"];
Создает ли это также новую строку? Потому что у меня все еще есть проблемы с памятью. Моя процедура работает так, что я добавляю строку чем-то, но, возможно, начинаю с пустой строки в начале.