2011-08-24 2 views
0

Je souhaite afficher certaines images lorsque l'image n'est pas disponible Je souhaite en afficher une par défaut. Lorsque vous utilisez la fonctionnalité d'analyse, j'obtiens des avertissements concernant une fuite potentielle. Je comprends que lors de l'utilisation d'imageNamed il n'y a pas de mémoire allouée, ce qui serait une solution de contournement agréable? Voir ci-dessous une partie de mon codeallocation de mem avec imageNamed

if (!isMyFileThere){ 
    image = [UIImage imageNamed:@"default.png"];    
} 
else{ 
    image = [[UIImage alloc] initWithContentsOfFile:pngFilePath]; 
} 

Répondre

3

Ceci est autoreleased

image = [UIImage imageNamed:@"default.png"]; 

Ce n'est pas

image = [[UIImage alloc] initWithContentsOfFile:pngFilePath]; 

Vous devez faire ceci:

image = [[[UIImage alloc] initWithContentsOfFile:pngFilePath] autorelease]; 

La règle est si votre nom de la méthode commence par alloc, new, copy ou muteableCopy vous possédez et avez besoin de libérer vous-même, que ce soit avec release ou autorelease. Tout le reste n'est pas à vous donc vous ne devez pas le libérer.

Si vous appelez retain sur un objet, vous devez release (ou autorelease) il le même nombre de fois :)

+0

oui, c'est exactement ce que je cherchais. – ErikS

0

image = [[UIImage alloc] initWithContentsOfFile:pngFilePath]; Vous avez fait un alloc et vous devez libérer maintenant, ce qui est une fuite potentielle si vous ne le faites pas. L'autre instruction est un objet autoreleased.

0

Si vous voulez vous opposer à un blocage jusqu'à ce que vous le relâchiez manuellement, utilisez retain, autorelease ajoute l'objet au pool NSAutorelease actuel qui est drainé à la fin de chaque itération de la boucle d'exécution. Si vous tentez d'utiliser un objet libéré, votre programme tombera en panne. Dans iOS 5.0, si vous activez ARC, vous n'aurez plus besoin d'utiliser "retain", "autorelease" ou "release". ceux-ci sont ajoutés automatiquement par le compilateur.