Правильная загрузка и обработка XML без потери памяти - PullRequest
2 голосов
/ 14 октября 2011

Я нахожусь на последней стадии настройки своего первого приложения для iPhone для выпуска и пытаюсь сбить килобайты, где смогу.У меня есть процесс, который синхронизирует некоторые данные с моим сервером при запуске приложения, и я заметил, что когда я это прокомментировал, мое приложение использует 7 МБ, когда оно завершается при запуске.Когда я включаю его, он использует 18 МБ, когда все готово к запуску.Сейчас я пытаюсь определить, какая часть процесса пожирает память, а не возвращает ее.Я отключил большую часть своей функции синхронизации, и у меня осталось это, и она все еще использует 2 МБ памяти и не освобождает ее, когда это будет сделано:

GDataXMLDocument *syncData = [[self getXmlWithUrl:@"http://SOMEURL"] autorelease];

Это просто использует мою вспомогательную функцию, чтобы выйти изагрузите XML-документ для меня, чтобы использовать.Моя вспомогательная функция выглядит следующим образом:

-(GDataXMLDocument*)getXmlWithUrl:(NSString*)url{
    NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
    NSURLResponse *resp = nil;
    NSError *err = nil;
    NSData *response = [NSURLConnection sendSynchronousRequest: theRequest returningResponse: &resp error: &err];
    return [[GDataXMLDocument alloc]initWithData:response options:0 error:&err];
}

Я помещаю релиз после создания syncData, но, конечно, он говорит, что он уже выделен.Любые идеи о том, что может быть причиной этого?

1 Ответ

0 голосов
/ 14 октября 2011

Две мысли.

  1. GDataXMLDocument - это анализ на основе DOM.Насколько велик ваш ответ?Как правило, анализ DOM требует 2-4x от исходного размера документа в оперативной памяти, может быть даже больше с определенными кодировками текста.Вам действительно нужен анализ DOM?Мы стараемся делать все наши вещи, используя SAX, чтобы он был прогрессивным и намного более эффективным в использовании памяти.

  2. Вы используете авто-релиз, поэтому память не будет освобождена, пока пул авто-релиза не будет освобожден,Вы можете обернуть код пулом автоматических выпусков, а затем избавиться от него.http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html

Наконец, синхронные HTTP-запросы, как правило, плохая идея, потому что производительность сети может быть настолько изменчивой, и вы заблокируете поток пользовательского интерфейса.

...