Утечка памяти из NSXMLParser - PullRequest
0 голосов
/ 16 мая 2011

я запускаю cocos2d с levelSVG, системой синтаксического анализа SVG от Sapus Media.
Я использую систему синтаксического анализа, которая работает, как и предполагалось, но у меня возникли некоторые проблемы с утечками памяти, связанными с NSXMLParser.
Утечки памяти дают постоянное падение частоты кадров в секунду в течение 5 минут и делают приложение бесполезным со скоростью 12 кадров в секунду в конце этого периода.
Я удалил все мои системы частиц и другие потенциально протекающие объекты, и утечка все еще существует ..

Запуск инструмента утечки памяти:
3 Обнаружены утечки объектов:
GeneralBlock-512
GeneralBlock-512
NSConcreteMapTable

Они ссылаются на:

*

NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];  

        [parser setDelegate:self];
        [parser setShouldProcessNamespaces:NO];
        [parser setShouldReportNamespacePrefixes:NO];
        [parser setShouldResolveExternalEntities:NO];
        [parser parse];

        NSError *parseError = [parser parserError];
        if(parseError) {
            SVGLOG(@"Error parsing SVG file: %@", parseError);
        }

        [parser release];

Как вы можете видеть, объект освобождается после завершения анализа.

Сводит меня с ума, кто-нибудь знает, что происходит?

1 Ответ

0 голосов
/ 17 мая 2011

Хорошо, после небольшого исследования я обнаружил ошибку в NSXMLParser при использовании метода URL, как описано выше.

NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url]

Изменив это на:

NSData *xml = [NSData dataWithContentsOfURL:url];            
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:xml];

Это исправило проблему утечки памяти, но все равно не учитывало постоянное падение частоты кадров в течение определенного периода времени. Затем я обнаружил, что мои выделения памяти для определенного класса, CCFollow, постоянно увеличивали время работы инструмента утечки памяти.

Затем я проверил код и запустил бесконечный CCAction - CCFollow в рамках метода повторяющегося обновления тиков. Это было источником утечки памяти. Устранение этой проблемы из метода обновления галочек и перемещение в метод инициализации устранило эту проблему.

...