0

我在我的应用程序中使用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个字节的数据。

这里同时泄漏的两张截图工具内 - >泄漏 - >调用树 leak at XML parser foundCharacters

leak at XML parser didEndElement

希望有人能帮助我!


编辑:

对于这些泄漏的解决方案是声明的NSMutableString和的NSMutableDictionary作为属性。 (请参阅Neal他的评论)

回答

2

我会建议您将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),你会得到一个编译错误每个点你以前使用伊娃,所以你不会错过任何从textInProgressself.textInProgress

+0

感谢您的评论。我已经尝试过您的解决方案,但它仍然在同一时间向我提供相同的泄漏/错误。你有没有其他的尝试? – BarryK88 2012-02-01 19:34:52

+0

@ BarryK88:使用ARC? ;) – 2012-02-01 19:57:50

+2

尝试用'dictInProgress'做同样的事情并运行静态分析器来检查任何明显的事情。 – 2012-02-01 20:31:29