我正在使用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