2011-06-10 68 views
-1

我的NSXMLParser泄漏,我不知道为什么!文书在详细说明中说,来源是[Parser parse]的100%;内存泄漏NSXMLParser

图片:Instruments leaks

这是我的分配和释放的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]; 
     } 
    } 
+1

您是否在委托方法中仔细检查了内存管理?其中一个漏洞可能显示来自'[Parser parse];' – 2011-06-10 14:43:26

+0

这个漏洞是在模拟器还是在设备上报告的?如果是模拟器,请在设备上再次测试 - 模拟器有时会出现错误泄漏。 – deanWombourne 2011-06-10 14:45:03

+0

你的意思是像didStartElement和儿子这样的方法吗?我已经检查了他们,但可以张贴他们以确保.. – Jos 2011-06-10 14:47:05

回答

1

它似乎是一个已知问题和NSXMLParser的开放式错误。

NSXMLParser Leaking

+0

好的,这是同样的泄漏是我受苦吗?我想知道苹果是否会解决这个问题(Bug是从'09)... – Jos 2011-06-10 15:08:47

+0

嗯,你的Leaks截图看起来不同于我的。当我看到NSXMLParser泄漏时,它们显示为泄漏NSConcreteMapTable。你在任何地方发布xmlArray吗? – 2011-06-10 16:06:26

+0

要么是这样,要么是你的currentElement泄漏。在我的项目中,我为currentElement使用了一个NSMutableString,它在parserDidStartDocument中被分配,并在parserDidEndDocument中被释放。然后我在didStartElement中使用[currentElement setString:]。 – 2011-06-10 16:11:54

1

我怀疑泄漏您的didStartElement内发生或didEndElement回调。请张贴这些以便我们检查。

+0

好吧!刚发布他们! – Jos 2011-06-10 14:52:56