2010-03-24 5 views
2

En utilisant des instruments, je continue d'être pointé vers une fuite de mémoire avec un UIImage.
Je pense que j'affecte et libère la mémoire correctement. L'objet divulgué dans les instruments est décrit comme suit: NSConcreteDataQuelle est la bonne façon d'allouer un UIImage à la mémoire et de le libérer iphone

La méthode correcte d'attribution et de libération d'un message UII est-elle la suivante?

UIImage* flagimg = [UIImage imageWithData: [NSData dataWithContentsOfURL:url2]];  
[flagimg release]; 
flagimg =nil; 

Répondre

8

[UIImage imageWithData:][UIImage imageWithData:] Renvoie un objet autoreleased que vous ne devez pas publier à nouveau. Donc ce code compressé ne contient pas de fuite de mémoire mais le contraire, un double gratuit (dans le pire des cas). Notez que Instruments génère parfois des faux positifs et/ou signale des fuites de mémoire dans la Foundation elle-même (oui, ils font aussi des erreurs :-).

Le meilleur moyen de alloc/libérer un objet est d'éviter initializers de proximité (comme imageWithData :) et au lieu de quelque chose comme

NSData* data = [[NSData alloc] initWithContentsOfURL:url]];
UIImage* img = [[UIImage alloc] initWithData:data];
[data release];
// use your image
[img release];

Cela affectera et libérer votre objet tout de suite et ne pas attendre la piscine autorelease est nettoyée.

Mais s'il vous plaît noter aussi qu'une fuite de mémoire est généralement pas la mémoire qui n'est pas encore libéré, mais qui est perdu et ne peut être libéré plus, donc un objet qui sera désallouée par la piscine autorelease est pas considéré comme une fuite de mémoire.

+0

Quelle est la conséquence d'une "double libération"? – dubbeat

+0

Habituellement un EXC_BAD_ACCESS (communément appelé segfault) qui fait planter votre programme. Cela arrive aussi si vous avez une référence à un objet qui est déjà désalloué et que vous essayez d'y accéder. – Alfonso

0

les deux imageWithData et dataWithContentsOfURL retour des objets autoreleased, de sorte que vous ne devriez pas avoir des fuites de mémoire dans cet extrait de code.

Étant donné que flagimg est renvoyé automatiquement, votre appel [flagimg release]; n'est pas nécessaire; vous relâchez trop cet objet.

1

en règle générale, vous pouvez dire

si vous créez un objet un Theres un « init », « copie » ou « conserver » en elle, vous devez libérer. sinon, vous obtenez un objet autoreleased.

ce n'est pas toujours vrai, mais dans la plupart des cas