2010-03-01 3 views
3

J'utilise le code suivant:UIButton setBackgroundImage consomme beaucoup de mémoire

UIImage *buttonImage; 

if (p.placeImage != nil) { 
    buttonImage = [UIImage imageWithData:p.placeImage]; 
} else { 
    buttonImage = [UIImage imageNamed:@"bg_place_noimg.png"]; 
} 

[imageButton setBackgroundImage:buttonImage forState:UIControlStateNormal]; 

Lors de l'exécution de l'application avec des instruments que je peux voir le setBackgroundImage consomme beaucoup de mémoire. Cependant, si je commente la dernière ligne, cela n'arrive pas. Une raison possible?

EDIT:

Si p.placeImage == nil et imageNamed: @ "bg_place_noimg.png" est utilisé l'utilisation de la mémoire est normale. p.placeImage est une valeur Transformable que j'utilise dans Core Data pour stocker des images NSData téléchargées à partir d'Internet.

Répondre

1

Je ne suis pas surpris que le fait de commenter la dernière ligne provoque moins de mémoire à consommer. Lorsque vous définissez cette image comme arrière-plan de votre bouton, l'image est très probablement conservée par le bouton et l'image reste donc en mémoire. Si vous n'appliquez pas l'image en tant qu'arrière-plan de bouton, le nombre de réceptions de UIImage est 0 et sa mémoire peut donc être récupérée par le système si nécessaire.

La théorie de Kristopher sur la différence entre imageWithData et imageNamed est également correcte. Consultez la section Discussion pour chacun de ces initialiseurs dans la documentation pour UIImage.

0

Je ne suis pas sûr, mais je suppose que votre problème est que imageWithData: crée une nouvelle image à chaque fois, tandis que la méthode imageNamed: renvoie la même image encore et encore.

Vous devrez peut-être ajouter du code pour mettre en cache et réutiliser des images identiques. Par exemple, vous pourriez peut-être utiliser une URL comme clé dans un dictionnaire d'images et créer uniquement de nouvelles images pour les URL qui n'ont pas encore été chargées.

Questions connexes