内存pipe理如何修复泄漏

我正在构build一个统计监视器应用程序,并使用XMLparsing器来检索我的数据。 经过大量的研究,对obj-c的内存pipe理和retainCount等的学习和阅读,但是我还是遇到了Instruments的内存泄漏问题。

for(int counter = 0; counter < [resultElement childCount]; counter++) { //Loop trough the childs //Instruments Leaks tells me that I have 75% leaks here [entryItem setObject:[[resultElement childAtIndex:counter] stringValue] forKey:[[resultElement childAtIndex:counter] name]]; } //Instruments Leaks tells me that I have 25% leaks here [totalEntries addObject:[entryItem copy]]; //Copy it into the MutableArray 

内存泄漏发生在XMLparsing器,但我不知道如何解决泄漏。

 - (NSString *)stringValue { if (_node->type == XML_TEXT_NODE || _node->type == XML_CDATA_SECTION_NODE){ return [NSString stringWithUTF8String:(const char *)_node->content]; //16.7% leaking } if (_node->type == XML_ATTRIBUTE_NODE){ return [NSString stringWithUTF8String:(const char *)_node->children->content]; //50.0% leaking } NSMutableString *theStringValue = [[[NSMutableString alloc] init] autorelease]; for (CXMLNode *child in [self children]) { [theStringValue appendString:[child stringValue]]; //33.3% leaking } return theStringValue; 

}

在线

 [totalEntries addObject:[entryItem copy]]; 

您复制对象(因此您的新对象的保留计数为1),并将其添加到totalEntries,这又增加了保留计数。 你错过了一个版本。 应该

 [totalEntries addObject:[[entryItem copy] autorelease]]; 

要么

 NSObject* copiedItem = [entryItem copy]; [totalEntries addObject:copiedItem]; [copiedItem release]; 

您可以使用静态分析器来了解这一点。 而随着ARC的到来,你很快就不用担心这个了(尽pipe无论如何都要对它有所了解)。

如果您对完整的细节感兴趣,并且所有可能的修复漏洞都是参考文献: http: //mobileorchard.com/find-iphone-memory-leaks-a-leaks-tool-tutorial/ http:// www。幻灯片下载网 / http://www.streamingcolour.com/blog/tutorials/tracking-iphone-memory-leaks/ http://dandesousa.com/2011/02/11/how-to-fix-ios-memory-leaks-coming -从-的UIKit /