NSString утечка памяти при разборе xml - PullRequest
0 голосов
/ 19 января 2011

пишу приложение, которое анализирует некоторые xml и создает словарь имен элементов и их значений, используя следующие ключевые методы:

- (void)parserDidStartDocument:(NSXMLParser *)parser{
    foundCharacters = [[NSMutableString alloc] init];
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    if (accumulator) {
        [foundCharacters appendString:string];
    }
} 

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

    if ([foundCharacters length] != 0) {

                    [parsedContent setObject:[foundCharacters copy] forKey:elementName];

                }
}

Утечка происходит в "[parsedContent setObject:"[foundCharacters copy] forKey: elementName]; "линия, я не могу найти способ преодолеть это.

Любые идеи будут высоко оценены.

Редактировать:

Утечка памяти происходит, только если запрос на анализ вызывается более одного раза

I 'мы также пробовали "[[foundCharacters copy] autorelease]", но нет avale

Ответы [ 2 ]

3 голосов
/ 19 января 2011

методы "copy" обрабатываются как alloc / init, вы отвечаете за их освобождение.Смотрите здесь:

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject/copy

, поэтому измените свой код на:

NSString *copy = [foundCharacters copy];
[parsedContent setObject:copy forKey:elementName];
[copy release];
2 голосов
/ 19 января 2011

В вашем parserDidStartDocument: вы выделяете / инициализируете изменяемую строку, но я не вижу кода, где вы удаляете эту строку снова. Вам нужно снова освободить строку, например, в методе parserDidEndDocument:.

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

...