2010-06-19 8 views
3

Mon application iPhone télécharge des fichiers image à partir d'un serveur, les stocke dans NSTemporaryDirectory(), puis charge l'image dans l'interface utilisateur de manière asynchrone. Le flux de code est comme suit:Fuite de mémoire UIGraphicsGetImageFromCurrentImageContext pour la mise à l'échelle de l'image

  1. Afficher la vue avec indicateur d'activité de chargement et exécuter un téléchargeur d'image en arrière-plan.
  2. Une fois l'image téléchargée, elle est écrite dans un fichier.
  3. Une minuterie dans la vue de chargement vérifie la disponibilité du fichier dans le répertoire temporaire et, une fois disponible, charge l'image à partir du fichier et ajoute l'image à l'interface utilisateur.
  4. Avant d'ajouter l'image, elle est redimensionnée à la taille requise.

Le problème est, j'utilise UIGraphicsGetImageFromCurrentImageContext pour mettre à l'échelle l'image. On dirait que la mémoire utilisée par le contexte de l'image n'est pas nettoyée. La mémoire de l'application ne cesse d'augmenter à mesure que plus de fichiers sont téléchargés.

Une partie du code ci-dessous:

code à l'échelle de l'image:


-(UIImage*)scaleToSize:(CGSize)size image:(UIImage *)imageref 
{ 
UIGraphicsBeginImageContext(size); 
[imageref drawInRect:CGRectMake(0, 0, size.width, size.height)]; 
UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
return scaledImage; 
} 

image Chargement du répertoire temporaire:


-(void)loadImageFromFile: (NSString *) path 
{ 
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
UIImage * imm = [[[UIImage alloc] initWithContentsOfFile:path] autorelease]; 
[self performSelectorOnMainThread:@selector(insertImage:) withObject:imm waitUntilDone:YES]; 
[pool release]; 
} 

Ajout image pour (sous-ensemble de code):


self.imageContainer = [[UIImageView alloc] initWithFrame:CGRectMake(0,80,320,250)]; 
[self addSubview:self.imageContainer]; 
self.imageContainer.image = [self scaleToSize:CGSizeMake(320.0f, 250.0f) image:imm]; 
[imageContainer release]; 

Que manque-t-il ici?

+0

-vous enlever les sous-vues aussi bien? Combien de mémoire pensez-vous fuyez-vous? Peut-être que le chargement du web est votre problème? Qu'est-ce qui vous fait penser que la mise à l'échelle est votre problème? – Eiko

+0

Merci pour votre réponse. Une enquête plus approfondie a révélé que la mise à l'échelle n'est pas le vrai problème. C'était l'instance d'image de l'interface utilisateur qui n'était pas nettoyée. Une idée de pourquoi cela pourrait être le cas? – KSH

+0

Avez-vous déjà trouvé une solution à ce problème? J'ai actuellement le même problème: 'UIImage' créé avec' UIGraphicsGetImageFromCurrentImageContext() 'est une fuite de mémoire. – MusiGenesis

Répondre

0

Une façon d'éviter la fuite de UIGraphicsGetImageFromCurrentImageContext est de ne pas l'appeler du tout en redimensionnant le conteneur au lieu de redimensionnement de l'image directement:

self.imageContainer.contentMode = UIViewContentModeScaleAspectFit; 
self.imageContainer.frame = CGRectMake(self.imageContainer.frame.origin.x, self.imageContainer.frame.origin.y, 320.0f, 250.0f);