2009-07-11 11 views
4

Mon application a une vue avec trois UIImageViews. Il y a environ 150 images en tant que fichiers de ressources, chacune d'un .jpg d'environ 24k. L'application affichera toutes les images, mais seulement trois à la fois. À chaque fois que je clique sur le bouton pour charger trois images supplémentaires dans le UIImageViews, la colonne "Overall Bytes" dans Instruments augmente d'environ 700K, jusqu'à ce que j'obtiens finalement un avertissement de mémoire faible, puis l'application plante. D'une certaine manière, la mémoire que j'utilise pour chaque chargement de trois images n'est pas libérée. J'ai fait des recherches sur google et essayé tous les moyens possibles, mais je n'ai pas réussi et j'ai besoin d'aide.Chargement de nouvelles images dans UIImageView, la mémoire des images précédentes n'est pas publiée

J'ai essayé ceci:. (Ce code fait partie de l'action de charger trois autres images Les trois ImageViews sont imgShownLeft, imgShownMiddle et imgShownRight Ce sont les variables d'instance, je dois d'abord mettre currentImage dans les trois UIImageViews.. , puis mis previousImage dans celui de gauche et nextImage dans la droite:

NSString *strImageToSet = [[imgNamesArray objectAtIndex:currentImage] stringByAppendingFormat:@".jpg"]; 
UIImage *img = [UIImage imageNamed:strImageToSet]; 
[imgShownMiddle setImage:img]; 
[imgShownLeft setImage:img]; 
[imgShownRight setImage:img]; 

NSString *strPreviousImage = [[imgNamesArray objectAtIndex:previousImage] stringByAppendingFormat:@".jpg"]; 
img = [UIImage imageNamed:strPreviousImage]; 
[imgShownLeft setImage:img]; 

NSString *strNextImage = [[imgNamesArray objectAtIndex:nextImage] stringByAppendingFormat:@".jpg"]; 
img = [UIImage imageNamed:strNextImage]; 
[imgShownRight setImage:img]; 

alors j'ai essayé ceci: au lieu de:

UIImage *img = [UIImage imageNamed:strImageToSet]; 

J'utilisé:

UIImage *img = [[UIImage alloc] initWithContentsOfFile:strImageToSet]; 

et affecté img au UIImageViews de la même manière, suivie par [img release];

Alors j'ai essayé:

UIImage *img = [[[UIImage alloc] initWithContentsOfFile:strImageToSet] autorelease]; 

Alors j'ai essayé:

img = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[imgNamesArray objectAtIndex:currentImage] ofType:@"jpg"]]; 

Mais dans tous les cas, les besoins en mémoire ont augmenté à chaque exécution de cette action.

Je sais qu'il est possible de garder trois images chargées à la fois sans stocker 150 images en mémoire! Qu'est-ce que je fais mal?

Merci pour tout commentaire. /SD

+0

Avez-vous trouvé une solution à ce problème? –

Répondre

-1

Je pense que ce que vous voulez est d'utiliser

img = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[imgNamesArray objectAtIndex:currentImage] ofType:@"jpg"]]; 

pour faire votre chargement (parce que UIImage imageNamed: est censé faire une mise en cache vous ne voulez pas), puis ajoutez

[img release]; 

après chaque appel setImage, car les sous-vues doivent être retain -sur les images, de sorte que vous fuyez un nombre de références.

J'aurais pensé que la deuxième version avec autorelease aurait fonctionné correctement, mais pour être honnête, les règles de gestion de la mémoire Cocoa parviennent toujours à me troubler même si je suis assez sûr de savoir ce que je fais.

+0

Vous ne devriez pas appeler 'release' sur ces images, vous ne les possédez pas. – Jim