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.
Avez-vous * désactivé * NSZombie? – kennytm
Le problème peut provenir de la façon dont vous initialisez theImage. Inclure cette section de votre code dans votre question aussi. – RunLoop
Je ne me souviens pas l'avoir activé en premier lieu. Est-il activé par défaut? – Friendlydeveloper