2012-03-11 4 views
0

Je fuites de mémoire dans le ... Par exemple, j'ai une UIImageView que l'image est inversée à chaque fois qu'il est mis à jour (animation est de 30fps donc ce met à jour l'image et flips ALOT)des problèmes avec des fuites de mémoire

image2 = [[UIImage alloc] initWithCGImage:image2.CGImage scale:image2.scale orientation:UIImageOrientationUpMirrored]; 

il devient de grandes quantités de fuites de mémoire, donc je libéré après que je feuilletais une fois:

image2 = [[UIImage alloc] initWithCGImage:image2.CGImage scale:image2.scale orientation:UIImageOrientationUpMirrored]; 
[image2 release]; 

mais pas le problème est que si je tente toujours d'exécuter ce code à nouveau le gel app (I » m devinant que vous ne pouvez pas libérer quelque chose et ensuite l'utiliser à nouveau? (Kinda nouveau à toute cette mémoire allouer et libérer des trucs ...

Que dois-je faire? Est-ce que je redéfinis l'image avant d'essayer de la retourner si elle a été libérée? Merci!

+0

Comment savez-vous qu'il y a des fuites? Avez-vous exécuté Analyzer? (On suppose qu'il s'agit d'une application non-ARC.) –

+0

C'est une sorte de conjecture sauvage sans voir ce que vous faites avec 'image2' par la suite, mais essayez de faire [image2 autorelease]' au lieu de 'release'. Ou faites simplement '[image2 release]' après avoir fini de l'utiliser. – yuji

+0

J'ai couru le profil dans Xcode en utilisant des instruments et trouvé les fuites. –

Répondre

1

Vous devez définir la propriété image de la vue de l'image sur l'image résultante, puis libérer l'image allouée. Par exemple:

image2 = [[UIImage alloc] initWithCGImage:image2.CGImage scale:image2.scale orientation:UIImageOrientationUpMirrored]; 
self.someImageView.image = image2; 
[image2 release]; 

Alternativement, vous pourriez simplement libérer l'image retournée. Comme si:

image2 = [[[UIImage alloc] initWithCGImage:image2.CGImage scale:image2.scale orientation:UIImageOrientationUpMirrored] autorelease]; 
self.someImageView.image = image2; 

Edit: après avoir éclairci ce que vous demandiez, voici une meilleure façon de retourner l'image verticalement.

//lets suppose your image is already set on the image view 
imageView.transform = CGAffineTransformIdentity; 
imageView.transform = CGAffineTransformMakeScale(1.0, -1.0); 

alors quand vous voulez changer de retour à la normale:

imageView.transform = CGAffineTransformIdentity; 
+0

D'accord mais si j'ai besoin de le faire à nouveau 1/30ème de seconde plus tard et l'image est déjà sortie comment puis-je le faire à nouveau? –

+0

Eh bien, je ne suis pas tout à fait sûr de ce que vous faites. En fait, votre code n'a aucun sens. Pourquoi définissez-vous 'image2' sur la même image (' image2') qu'elle est déjà?Êtes-vous en miroir de l'image ou quelque chose? Probablement pas la façon la plus optimisée de le faire. Avez-vous déjà pensé à utiliser des transformations à la place? –

+0

Je le mets à lui-même mais en miroir ... en ce moment l'image2 actuelle est à l'envers, donc je la réoriente. Mais je dois utiliser ce code, qui le réoriente, chaque fois que l'image est mise à jour à une nouvelle image (ce qui est tous les 1/30 de seconde) Donc, si je le relâche, actualiser l'image puis réorienter le tout l'application se bloque et quitte. –

2

probablement l'approche la plus simple est de faire image2 une propriété retenue, puis attribuez-lui à self.image2 plutôt que simple image2. Cela entraînera la libération de l'ancienne image lorsqu'une nouvelle valeur est attribuée. Mais vous devrez alors ajouter un appel autorelease à votre appel [UIImage alloc] init... pour libérer la retenue effectuée par le alloc.

2

Vous rendez la configuration inutilement déroutante en réutilisant le même nom de variable. Ajouter une variable temporaire

UIImage* image; // assuming you set this up earlier, and that it's retained 
UIImage* flippedImage = [[UIImage alloc] initWithCGImage:image.CGImage scale:image.scale orientation:UIImageOrientationUpMirrored]; 
// Now we're done with the old image. Release it, so it doesn't leak. 
[image release]; 
// And set the variable "image" to be the new, flipped image: 
image = flippedImage; 
+0

Ok, mais si j'ai besoin de refaire ce code 1/30e de seconde plus tard quand l'image est mise à jour vers une nouvelle image retournée et que j'ai besoin de la retourner, est-ce que je vais la bloquer? –

+0

Ou est-ce que le redéfinir (avec l'astérisque) agit comme un "non-relâchement" si vous voulez? –

+1

Si vous faites exactement ce code à 'image', encore et encore, alors cela devrait fonctionner correctement. Avant que le code ne s'exécute, 'image' pointe vers une UIImage conservée. Une fois le code exécuté, 'image' pointe vers une autre UIImage conservée, et l'ancienne image a disparu. –

Questions connexes