我正在使用XMLParser解析一些XML数据,它使用NSMutableString * resultString来存储标记字符。在每个( - parser:didStarElement ...)方法中,我分配并初始化resultString-ivar。内存泄漏NSMutableString appendString
- (void)parser: (NSXMLParser *)parser didStartElement: (NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName: (NSString *)qName attributes: (NSDictionary *)attributeDict {
// Alot of if-statements to sort subtags
// /.../
resultString = [[NSMutableString alloc] init];
recordResults = YES;
}
将字符串添加到解析器中:foundCharacters-method。我在某处读取自动释放对象,比如appendString中的字符串可能导致内存泄漏的图像。所以我加了一个本地autorelease池,以确保它得到倒掉马上(的行为没有改变,虽然):
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
if(recordResults) {
[resultString appendString: string];
}
[pool drain];
}
在解析器:didEndElement ......我终于释放和无出resultsString:
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
// Alot of if statements to handle differnt tags
// each of which has the structure of the last else-statement
// In other words, I am pretty sure I've covered every possible
// case to prevent the resultString from
// not getting released and niled out
if(...) {
...
}
else if(...) {
...
}
else {
if(resultString != nil) {
[dataDict setObject: resultString forKey: elementName];
[resultString release];
resultString = nil;
}
}
仪器泄漏工具标记解析器:foundCharacter方法作为内存泄漏的来源,所以我想知道这是否是由appendString引起的。或者如果你能在这段代码中找到一些出错的东西。 这是一个相当渴望内存的应用程序,解析iPhone上的相当多的,有时是中等大小的XML文件,所以我的问题是如何找到解决办法,如果在这种情况下NSMutableString appendString不适合...
在此先感谢!
我不确定parserDidEndDocument是否在解析错误时被调用,但这应该很容易测试。 – ergosys 2010-01-13 00:29:23
好点!应该做一些性能改进,对,因为我不必为每个标记分配和初始化NSMutableString? 并截断你只是建议设置[resultString setString:@“”]? – jollyCocoa 2010-01-13 06:48:00
我试过你的这个解决方案。它似乎解决了这个问题。非常感谢! 我非常幸运能够使用XML来处理所有关闭标记。但是,如果没有,我想我可以实现解析器:parseErrorOccured或处理这些... – jollyCocoa 2010-01-13 08:09:10