解析xml时NSString内存泄漏

时间:2011-01-19 10:08:16

标签: objective-c parsing memory-leaks nsstring

正在编写一个解析一些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];”我无法找到解决这个问题的方法。

非常感谢任何见解。

编辑:

只有在多次调用解析请求时才会发生内存泄漏

我也尝试过“[[foundCharacters copy] autorelease]”但是没有用到

2 个答案:

答案 0 :(得分:3)

“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];

答案 1 :(得分:2)

在你的parserDidStartDocument:中你分配/初始化一个可变字符串,但是我没有看到你再次处理这个字符串的代码。您需要再次释放该字符串,例如在parserDidEndDocument:方法中。

稍后会报告内存泄漏可能是因为这是实际引用变量的最后一个位置。