XML解析器中的内存泄漏与NSMutableString
问题描述:
我在我的应用程序中使用XMLparser。它运行良好,但是当我在乐器中运行我的应用程序时,我一直在处理XML出来的字符串的NSMutableString获取内存泄漏。XML解析器中的内存泄漏与NSMutableString
问题是这个内存泄漏只发生在我第二次执行特定的调用(登录)时。当我进行其他调用时,我没有发现内存泄漏。
给出泄漏的NSMutableString是'textInProgress'。
- (NSDictionary *)objectWithData:(NSData *)data
{
[dictionaryStack release];
[textInProgress release];
dictionaryStack = [[NSMutableArray alloc] init];
textInProgress = [[NSMutableString alloc] init];
[dictionaryStack addObject:[NSMutableDictionary dictionary]];
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
parser.delegate = self;
BOOL success = [parser parse];
[parser release];
if (success)
{
NSDictionary *resultDict = [dictionaryStack objectAtIndex:0];
return resultDict;
}
return nil;
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
NSMutableDictionary *parentDict = [dictionaryStack lastObject];
NSMutableDictionary *childDict = [NSMutableDictionary dictionary];
[childDict setObject:attributeDict forKey: NODE_ATTR_KEY];
id existingValue = [parentDict objectForKey:elementName];
if (existingValue)
{
NSMutableArray *array = nil;
if ([existingValue isKindOfClass:[NSMutableArray class]])
{
array = (NSMutableArray *) existingValue;
}
else
{
array = [NSMutableArray array];
[array addObject:existingValue];
[parentDict setObject:array forKey:elementName];
}
[array addObject:childDict];
}
else
{
[parentDict setObject:childDict forKey:elementName];
}
[dictionaryStack addObject:childDict];
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
NSMutableDictionary *dictInProgress = [dictionaryStack lastObject];
if ([textInProgress length] > 0)
{
[dictInProgress setObject:textInProgress forKey:NODE_VALUE_KEY];
[textInProgress release];
textInProgress = [[NSMutableString alloc] init]; <--- Object leaks here
}
[dictionaryStack removeLastObject];
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
[textInProgress appendString:string]; <--- Object leaks here
}
我已经调试整天,仍然无法找到解决方案,这个问题。泄漏只包含64个字节的数据。
这里同时泄漏的两张截图工具内 - >泄漏 - >调用树
希望有人能帮助我!
编辑:
对于这些泄漏的解决方案是声明的NSMutableString和的NSMutableDictionary作为属性。 (请参阅Neal他的评论)
答
我会建议您将textInProgress
转换为属性而非ivar。就像这样:
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
NSMutableDictionary *dictInProgress = [dictionaryStack lastObject];
if ([self.textInProgress length] > 0) {
[dictInProgress setObject:self.textInProgress forKey:NODE_VALUE_KEY];
self.textInProgress = [NSMutableString string];
}
[dictionaryStack removeLastObject];
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
[self.textInProgress appendString:string];
}
而只是确保你释放它在dealloc
普罗蒂普:如果您更改属性的相应伊娃的名称,以及(如_textInProgress
),你会得到一个编译错误每个点你以前使用伊娃,所以你不会错过任何从textInProgress
到self.textInProgress
感谢您的评论。我已经尝试过您的解决方案,但它仍然在同一时间向我提供相同的泄漏/错误。你有没有其他的尝试? – BarryK88 2012-02-01 19:34:52
@ BarryK88:使用ARC? ;) – 2012-02-01 19:57:50
尝试用'dictInProgress'做同样的事情并运行静态分析器来检查任何明显的事情。 – 2012-02-01 20:31:29