7
votes

Fuite de mémoire cgimageref

Je dispose d'une fuite de mémoire lorsque vous utilisez cette méthode personnalisée qui retourne un CGIMageref. Je ne peux pas libérer correctement "cgimage" parce que je dois le retourner. Que dois-je faire? XXX


1 commentaires

J'ai eu une fuite similaire. Essayez ma réponse ici: Stackoverflow.com/a/23669476/3631310


4 Réponses :


16
votes

cgimage code> appartient à votre méthode, vous devez le renvoyer et donner la responsabilité de l'appelant à la libérer via cfrelease code>.

Vous pouvez également renvoyer le CGIMAGE CODE> Envoyé à l'intérieur d'un UIIMAGE code>, comme celui-ci: p>

UIImage *image = [UIImage imageWithCGImage:cgImage];
CFRelease(cgImage); //cgImage is retained by the UIImage above
return image;


1 commentaires

Cette réponse n'est plus pertinente: «Cfrelease» est indisponible: les objets de base de base sont automatiquement géré la mémoire.



11
votes

Ceci est un problème général avec les objets de base de base, car il n'y a pas de piscine d'autoraélase à cf. Comme je le vois, vous avez deux options pour résoudre le problème:

  1. renommer la méthode à quelque chose comme -Newrectrondedimageref: rayon: Pour dire à l'appelant qu'il s'approche de l'objet retourné et responsable de la libération.
  2. envelopper le cgimageref dans un uIImage uIImage [UIIMAGE imagewithcgimage:] ). C'est probablement ce que je ferais.

0 commentaires

3
votes

Vous pouvez autoriser un objet de base compatible de base. Cela a juste l'air un peu bonky. :)

La manière GC-Safe est comme: p> xxx pré>

Le raccourci, qui est sûr sur iOS, mais plus sûr sur le Mac, est-ce: P>

CGImageRef image = ...;
if (image) {
    image = (CGImageRef)[(id)image autorelease];
}


0 commentaires

3
votes

Comme suggéré, nous avons utilisé: xxx

mais nous avons toujours une fuite de mémoire. Notre solution consistait à envelopper le code avec un bloc xxx

et qui résoudra notre problème.


1 commentaires

Toujours ne le libère pas correctement tbh