Agregar UIImage a NSMutable array para una animation

Tengo una aplicación que crea una animation a partir de imágenes almacenadas en un grupo en mi browser de proyecto (no Images.xcassets ). Este código "funciona" en que se anima correctamente, pero el uso de imageNamed provoca una pérdida de memory porque los files de image no se desasignan.

No puedo entender por qué agregar con imageNamed: works agrega imágenes a mi matriz, pero imageWithContentsOfFile: does not.

Un poco de información sobre la mecánica de mi aplicación:

self.myPhoto se establece en la segue desde otro ViewController . El número de imágenes puede variar, así que pruebo para ver que el file está "allí" antes de agregarlo a la matriz.

Los nombres de file siguen esta convención de nomenclatura:

 "1-1.jpg" "2-1.jpg" "2-2.jpg" "99-1.jpg" "99-2.jpg" "99-3.jpg" "99-4.jpg" 

Este código funciona, pero las imágenes no se desasocian y provocan una pérdida de memory:

 - (void)startAnimation { NSMutableArray *imageArray = [[NSMutableArray alloc] init]; for (int imageNumber = 1; self.myPhoto != nil; imageNumber++) { NSString *fileName = [NSString stringWithFormat:@"%@-%d.jpg", self.myPhoto, imageNumber]; // check if a file exists if ([UIImage imageNamed:fileName]) { // if it exists, add it to the array [imageArray addObject:[UIImage imageNamed:fileName]]; } else { // otherwise, don't add image to the array break; } } self.myImageView.animationImages = imageArray; self.myImageView.animationDuration = 1.5f; self.myImageView.animationRepeatCount = 0; self.myImageView.contentMode = UIViewContentModeScaleAspectFit; [self.myImageView startAnimating]; } 

Ejecuté Instruments en él y vi que tenía una pérdida de memory que emanaba de mi animation. Cavando un poco sobre StackOverflow, descubrí que la manera en que agrego mis files a myArray hace que las imágenes no se desasignen.

Entonces intenté esto, en cambio:

 - (void)startAnimation { NSMutableArray *imageArray = [[NSMutableArray alloc] init]; for (int imageNumber = 1; self.myPhoto != nil; imageNumber++) { NSString *fileName = [NSString stringWithFormat:@"%@-%d", self.myPhoto, imageNumber]; // check if a file exists if ([UIImage imageNamed:fileName]) { // if it exists, add it to the array [imageArray addObject:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle]pathForResource:[NSString stringWithFormat:@"%@", fileName] ofType:@"jpg"]]]; NSLog(@"%@ added to imageArray", fileName); } else { // otherwise, don't add image to the array break; } } NSLog(@"There are %lu images in imageArray", (unsigned long)imageArray.count); self.myImageView.animationImages = imageArray; self.myImageView.animationDuration = 1.5f; self.myImageView.animationRepeatCount = 0; self.myImageView.contentMode = UIViewContentModeScaleAspectFit; [self.myImageView startAnimating]; } 

Cuando lo hago de esta manera, aparece la página donde se carga la animation, pero las imágenes no se agregan a mi matriz: la. Este es un problema bien documentado. Aquí hay algunas publicaciones que cubren este problema:

Memoria sucia debido a la image de CoreAnimation y CG

¿Cómo utilizo imageWithContentsOfFile para una matriz de imágenes usadas en una animation?

Gracias por leer. Estoy perplejo, aunque confío en que la resolución de este problema sea una supervisión estúpidamente sorprendente de mi parte. Demuéstrame bien;)

Hice algunos pequeños cambios por desesperación y tropecé con la "respuesta". Nota de comentarios donde hice cambios:

 - (void)startAnimation { NSMutableArray *imageArray = [[NSMutableArray alloc] init]; for (int imageNumber = 1; self.myPhoto != nil; imageNumber++) { // I set the filename here, adding .jpg to it NSString *fileName = [NSString stringWithFormat:@"%@-%d.jpg", self.myPhoto, imageNumber]; // check if a file exists if ([UIImage imageNamed:fileName]) { // if it exists, add it to the array // I blanked out ofType, as it's set when I create the local fileName variable [imageArray addObject:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle]pathForResource:[NSString stringWithFormat:@"%@", fileName] ofType:@""]]]; } else { // otherwise, don't add image to the array break; } } self.myImageView.animationImages = imageArray; self.myImageView.animationDuration = 1.5f; self.myImageView.animationRepeatCount = 0; self.myImageView.contentMode = UIViewContentModeScaleAspectFit; [self.myImageView startAnimating]; } 
    Intereting Posts