2010-03-27 3 views
0

Je suis actuellement face à la question suivante:Ajout d'images à un problème de mémoire de tableau

Mon application crée dynamiquement des images (320 x 480 pixels) et les ajoute à un NSMutableArray. J'ai besoin de ces images à l'intérieur de ce tableau afin de permettre aux utilisateurs de les parcourir d'avant en arrière. J'ai seulement besoin de garder les 5 dernières images. Donc, j'ai écrit une méthode comme ci-dessous:

- (void)addImageToArray:(UIImage*)theImage { 
    if ([myMutableArray count] < 5) { 
     [myMutableArray addObject:theImage]; 
    } 
    else { 
     [myMutableArray removeObjectAtIndex:0]; 
     [myMutableArray addObject:theImage]; 
    } 
} 

Cette méthode fait essentiellement ce qu'il est censé faire. Cependant, dans les instruments que je peux voir, cette utilisation de la mémoire s'incrémente en permanence. À un certain point, même si je n'ai pas de fuites de mémoire, l'application se bloque finalement. La façon dont je le vois, XCode supprime l'image de mon tableau, mais ne le libère pas. Y a-t-il un moyen de m'assurer que l'objet que je veux retirer de mon tableau sera également libéré? Peut-être que mon approche est complètement fausse et que je dois trouver une autre voie.

Toute aide appréciée. Merci à l'avance

[EDIT:]

Comme l'a demandé, j'ajoute une partie de mon code, ce qui crée l'image:

-(UIImage*)getGL { 
unsigned char buffer[320*480*4]; 
glReadPixels(0,0,320,480,GL_RGBA,GL_UNSIGNED_BYTE,&buffer); 

CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, &buffer, 320*480*4, NULL); 
CGImageRef iref = CGImageCreate(320,480,8,32,320*4,CGColorSpaceCreateDeviceRGB(),kCGBitmapByteOrderDefault,ref,NULL,true,kCGRenderingIntentDefault); 

size_t width   = CGImageGetWidth(iref); 
size_t height  = CGImageGetHeight(iref); 
size_t length  = width*height*4; 
uint32_t *pixels  = (uint32_t *)malloc(length); 
CGContextRef _context = CGBitmapContextCreate(pixels, width, height, 8, width*4, CGImageGetColorSpace(iref), kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
CGContextTranslateCTM(_context, 0.0, height); 
CGContextScaleCTM(_context, 1.0, -1.0); 
CGContextDrawImage(_context, CGRectMake(0.0, 0.0, width, height), iref); 
CGImageRef outputRef = CGBitmapContextCreateImage(_context); 
UIImage *outputImage = [UIImage imageWithCGImage:outputRef]; 


CGDataProviderRelease(ref); 
CGImageRelease(iref); 
CGImageRelease(outputRef); 
CGContextRelease(_context); 

return outputImage; 
} 

Donc, maintenant je peux faire quelque chose comme ceci:

[self addImageToArray:[self getGL]]; 

Espérons que cela aide. Merci encore.

+0

Avez-vous * désactivé * NSZombie? – kennytm

+0

Le problème peut provenir de la façon dont vous initialisez theImage. Inclure cette section de votre code dans votre question aussi. – RunLoop

+0

Je ne me souviens pas l'avoir activé en premier lieu. Est-il activé par défaut? – Friendlydeveloper

Répondre

0

Bon, problème trouvé - problème résolu :)

En fait, ma méthode getGL manquait quelque chose:

free(pixels); 

Cela n'a pas causé de fuites de mémoire, mais à la place incrémenter la mémoire. Maintenant tout est de retour à la normale.

1

Il peut y avoir plusieurs raisons pour lesquelles la mémoire n'est pas libérée. L'une est que vous ajoutez toutes les images dans une boucle et que le pool d'autorelease ne libère pas d'objets auto-libérés tant que le contrôle ne revient pas à la boucle d'exécution. Vous pourriez vouloir créer et libérer un NSAutoreleasePool pour chaque fois à travers la boucle.

Un autre est que les objets ne sont pas correctement libérés. Utilisez "Construire et analyser" pour trouver des fuites de mémoire évidentes.

Questions connexes