[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.
Quelle est la conséquence d'une "double libération"? – dubbeat
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