2010-02-15 4 views
3

L'analyseur statique montre une fuite dans ce bloc de code (en particulier le lien avec la copie en elle):mémoire d'avertissement de fuite, je ne peux pas résoudre

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qName 
{ 
    if ([elementName isEqualToString:@"item"]) 
    { 
     [elements setObject:title forKey:@"title"]; 
     [elements setObject:date forKey:@"date"]; 
     [elements setObject:summary forKey:@"summary"]; 
     [elements setObject:link forKey:@"link"]; 

     [posts addObject:[elements copy]]; 
    } 
} 

J'ai essayé libérer l'objet copié mais je toujours recevoir l'avertissement. Est-ce que je manque quelque chose?

Merci

Répondre

5

Vous avez créé une nouvelle copie que vous ne relâchez pas.

Ce nouvel objet retourne elements avec comptage ref 1 dont vous êtes responsable de désaffecter puisque vous venez de créer une copie:

[elements copy]; 

Dans cette ligne, vous ajoutez la nouvelle copie créée pour posts qui ressemble à collection. Toutes les collections conservent de nouvelles valeurs, de sorte que vous passez votre copie avec comptage ref 1 et messages augmenter le nombre de ref 2 en le retenant.

[posts addObject:[elements copy]]; 

A sa sortie posts sera envoyé à chaque élément release qui décrémenter compte de référence à 1 si elements ne reçoit pas désalloué et vous vous retrouvez avec fuite de mémoire.

Retirez le copy et voir si cela aide:

[post addObject:elements]; 
+0

merci parfait. – Kieran

3

Juste pour faire un point parfaitement clair:

J'ai essayé libérer l'objet copié mais je reçois toujours l'avertissement.

Vous voulez dire que essayé?

[posts addObject:[elements copy]]; 
    [elements release]; 

Ceci ne résout pas le problème et peut causer un second problème.

Le problème que vous avez commencé avec est que vous la copie une fuite de -le objet que la méthode copy retourné, l'objet que vous avez ajouté à posts. Ce problème demeure: Vous n'avez pas publié la copie.

Le problème que vous avez ajouté est que vous libérez l'objet original, qui peut ne pas être ce que vous avez l'intention de faire; Je ne peux pas dire avec certitude sans voir votre autre code. Vous devez vous assurer de ne pas libérer elements jusqu'à ce que vous ne avez plus besoin.

Vous pouvez envoyer elements un message removeAllObjects à la place; cela permettra de garder l'objet autour, mais videz-le en préparation de l'élément suivant. Sur une note non liée, vous pouvez également renommer elements pour refléter plus fidèlement la nature de son dictionnaire et l'extraire de sa représentation XML. « elements » sonne comme un tableau pour moi. « feedItemProperties » pourrait être plus approprié.

+0

Merci pour les commentaires.Je vois ce que je faisais mal maintenant. Merci. – Kieran