内存泄漏NSXMLParser
我的NSXMLParser泄漏,我不知道为什么!文书在详细说明中说,来源是[Parser parse]
的100%;内存泄漏NSXMLParser
这是我的分配和释放的NSXMLParser代码:
NSURL *xmlURL = [NSURL URLWithString:@"http://www.website.com/link.xml"];
NSData * dataXml = [[NSData alloc] initWithContentsOfURL:xmlURL];
Parser = [[NSXMLParser alloc] initWithData:dataXml];
[dataXml release];
Parser.delegate = self;
[Parser parse];
[Parser release];
委托方法
//Standard function parser: reading open tag
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
attributes:(NSDictionary *)attributeDict{
currentElement = elementName;
if ([elementName isEqualToString:@"item"]) {
xmlArray = [[NSMutableDictionary alloc] init];
}
}
//Standard function parser: reading string
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
if ([currentElement isEqualToString:@"created_time"]){
valueKey = [xmlArray valueForKey:currentElement];
if(nil != valueKey)
{
valueKey = [valueKey stringByAppendingString:string];
}else
{
valueKey = string;
}
[xmlArray setObject:valueKey forKey:currentElement];
}
if ([currentElement isEqualToString:@"message"]){
valueKey = [xmlArray valueForKey:currentElement];
if(nil != valueKey)
{
valueKey = [valueKey stringByAppendingString:string];
}else
{
valueKey = string;
}
[xmlArray setObject:valueKey forKey:currentElement];
}
if ([currentElement isEqualToString:@"picture"]){
valueKey = [xmlArray valueForKey:currentElement];
if(nil != valueKey)
{
}else
{
valueKey = string;
}
[xmlArray setObject:valueKey forKey:currentElement];
}
}
//Standard function parser: reading close tag
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName{
if ([elementName isEqualToString:@"item"]) {
Post *newPost = [[Post alloc] init];
newPost.created_time = [xmlArray objectForKey:@"created_time"];
newPost.message = [xmlArray objectForKey:@"message"];
newPost.picture = [xmlArray objectForKey:@"picture"];
[containerArray addObject:newPost];
[xmlArray release];
[newPost release];
}
}
它似乎是一个已知问题和NSXMLParser的开放式错误。
好的,这是同样的泄漏是我受苦吗?我想知道苹果是否会解决这个问题(Bug是从'09)... – Jos 2011-06-10 15:08:47
嗯,你的Leaks截图看起来不同于我的。当我看到NSXMLParser泄漏时,它们显示为泄漏NSConcreteMapTable。你在任何地方发布xmlArray吗? – 2011-06-10 16:06:26
要么是这样,要么是你的currentElement泄漏。在我的项目中,我为currentElement使用了一个NSMutableString,它在parserDidStartDocument中被分配,并在parserDidEndDocument中被释放。然后我在didStartElement中使用[currentElement setString:]。 – 2011-06-10 16:11:54
您是否在委托方法中仔细检查了内存管理?其中一个漏洞可能显示来自'[Parser parse];' – 2011-06-10 14:43:26
这个漏洞是在模拟器还是在设备上报告的?如果是模拟器,请在设备上再次测试 - 模拟器有时会出现错误泄漏。 – deanWombourne 2011-06-10 14:45:03
你的意思是像didStartElement和儿子这样的方法吗?我已经检查了他们,但可以张贴他们以确保.. – Jos 2011-06-10 14:47:05