Хобрук: Ваш путь к мастерству в программировании

Утечка памяти NSXMLParser из-за второго вызова синтаксического анализа

Обновление. Хотя инструмент Leaks указывает на первый вызов [parser parse];, я определил, что утечка происходит только тогда, когда я делаю этот вызов во второй раз. Я не вижу в справочнике или документации класса NSXMLParser ничего, что указывает на невозможность повторного синтаксического анализа. Я что-то упускаю? Должен ли я создавать новый NSXMLParser каждый раз, когда я хочу проанализировать документ?

В настоящее время я пытаюсь отследить утечку в моем коде синтаксического анализа xml для приложения для iPhone. Я просмотрел другие сообщения об утечках с помощью NSXMLParser, но не нашел ответов, которые можно было бы использовать, поэтому я был бы очень признателен за помощь.

Инструмент инструментов Leaks обнаруживает утечку в следующем коде:

NSData* data = [NSData dataWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @"collisionGraph" ofType: @"graphml"]];
NSXMLParser* parser = [[[NSXMLParser alloc] initWithData: data] autorelease];
[parser setDelegate:self];
[parser parse];    <<<<< leak here according to Leaks
self.currentPass++;

...

[parser parse];
self.currentPass++;

Я удалил весь код из моих методов обратного вызова делегата, но это не остановило утечку.

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
 namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qualifiedName 
   attributes:(NSDictionary *)attributeDict
{
}

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
}  

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
 namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qName
{
}

Вот вид в инструментах http://i22.photobucket.com/albums/b311/Erithil/ParserLeak.png (ссылка, потому что у меня нет представителя для публикации изображений).

Я действительно озадачен этим, поэтому приветствую любые предложения. Заранее спасибо.


  • Где вы вызываете освобождение вашего объекта NSXMLParser? Можете ли вы проверить с помощью отладчика или оператора ведения журнала, что ваш код для вызова release действительно выполняется? - [Анализатор NSXMLParser] может выделять память, которую он ожидает очистить, когда синтаксический анализатор будет освобожден. 24.02.2011
  • @Ryan Спасибо, Райан. Один из моих коллег также предположил, что анализатор может давать утечку, потому что пул автозапуска может не освобождаться своевременно. Я тестировал замену вызова 'autorelease' вызовом '[parser release];' в конце метода. Используя отладчик, я подтвердил, что был сделан запрос на освобождение. Тем не менее утечка все же присутствовала. 24.02.2011

Ответы:


1

Это может быть утечка в NSXMLParser (если, например, xmlCleanupParser () не вызывается в базовом libxml) или многоразовая память, ошибочно отмеченная как утечка. Я думаю, что это то, что обычно происходит с синтаксическими анализаторами из-за того, что они повторно используют (а не освобождают должным образом?) Свою выделенную память.

23.02.2011
  • Я понимаю. Есть ли способ точно определить, является ли утечка реальной (и если не сказать Leaks, чтобы она ее игнорировала), или мне просто нужно обойти это, используя отдельные объекты NSXMLParser? Спасибо. 24.02.2011
  • Я не думаю, что в NSXMLParser есть возможность дважды проанализировать документ. Ожидается, что вы создадите, проанализируете, а затем уничтожите. 24.02.2011
  • Новые материалы

    HMTL - Многозадачное обучение для решения задач НЛП
    Достижение результатов SOTA путем передачи знаний между задачами Область обработки естественного языка включает в себя десятки задач, среди которых машинный перевод, распознавание именованных..

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..