2011-06-10 3 views
-1

Mon NSXMLParser fuit et je ne sais pas pourquoi! L'instrument dit, dans les détails étendus, que la source est 100% de [Parser parse];Mémoire de fuite NSXMLParser

Image: Instruments leaks

Ceci est mon code pour l'attribution et la libération du 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]; 

Les méthodes déléguées

//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

Avez-vous revérifié votre gestion de la mémoire dans les méthodes de délégué? Une fuite dans l'un d'entre eux pourrait provenir de '[Parser parse];' –

+0

Cette fuite est-elle signalée dans le simulateur ou sur un périphérique? Si c'est le simulateur, testez à nouveau sur un appareil - le simulateur donne parfois de fausses fuites. – deanWombourne

+0

Vouliez-vous dire les méthodes comme didStartElement et fils? Je les ai vérifiés mais je peux les poster pour être sûrs. – Jos

Répondre

1

Il semble être un problème connu et un bogue ouvert avec NSXMLParser.

NSXMLParser Leaking

+0

Ok, est-ce la même fuite que je souffre? Je me demande si Apple corrigera jamais ça (le bug date de '09) ... – Jos

+0

Hmm, la capture d'écran de vos fuites est différente de la mienne. Quand je vois des fuites de NSXMLParser ils apparaissent comme fuite NSConcreteMapTable. Est-ce que vous libérez xmlArray n'importe où? –

+0

Soit cela, ou votre currentElement fuit. Dans mon projet, j'ai utilisé un NSMutableString pour currentElement, qui est alloué dans parserDidStartDocument et publié dans parserDidEndDocument. Ensuite, j'utilise le [currentElement setString:] dans didStartElement. –

1

Je soupçonne que la fuite se produit à l'intérieur de votre didStartElement ou Les callbacks de didEndElement. Veuillez les poster pour que nous puissions vérifier.

+0

Ok! Je viens de les poster! – Jos