【发布时间】:2011-01-04 10:26:08
【问题描述】:
我正在使用 XMLParser 来解析一些 XML 数据,它使用 NSMutableString *resultString 来存储标记字符。在每个 (- parser: didStarElement...) 方法中,我分配并初始化 resultString-ivar。
- (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;
}
字符串附加在 parser:foundCharacters 方法中。我在某处读到自动释放对象,例如 appendString 中的字符串可能会导致内存泄漏的图像。所以我添加了一个本地自动释放池以确保它立即被耗尽(虽然行为没有改变):
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
if(recordResults) {
[resultString appendString: string];
}
[pool drain];
}
在解析器中:didEndElement...我终于释放并清除了结果字符串:
-(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;
}
}
Instruments Leak-tool 将 parser:foundCharacter-method 标记为内存泄漏源,所以我想知道这是否是由 appendString 引起的。或者,如果您可以在此代码中找到一些错误的地方。 这是一个相当需要内存的应用程序,在 iPhone 上解析很多,有时是中等大小的 XML 文件,所以我的问题是如何找到解决方法,如果 NSMutableString appendString 在这种情况下不合适......
提前致谢!
【问题讨论】:
标签: iphone memory string append memory-leaks