Terminación debido a la presión de la memory con causa conocida, solución desconocida

Mi aplicación está terminando debido a la presión de la memory en un cierto punto en el uso de la aplicación, y he aislado el problema a un trozo de código que está causando el problema.

Copiaré el fragment de código a continuación, pero primero describiré lo que está haciendo.

La descripción :

Tengo un bucle for que está recorriendo una list de videos. Para cada video, el bucle for aumenta el tamaño de la vista de desplazamiento que contiene, dibuja una label y un button (ambos relacionados con el video) y asíncrona toma una miniatura del video y la coloca debajo del button.

El problema :

El agarre de la parte de la miniatura es el problema. No creo que el hecho de que esto se haga de forma asíncrona es el problema, ya que lo he intentado sincrónicamente y la terminación todavía se produce. Cuando comento el código que captura la miniatura (la parte asíncrona completa en el código a continuación), la aplicación no falla.

El codigo :

NB: Estoy usando comentarios para replace el código en algunos casos por brevedad.

for (int i = [_videoURLs count]-1; i >= 0 ; i--) { //increase the scrollview size //get background image: dispatch_async(screenshotQueue, ^{ AVURLAsset *as = [[AVURLAsset alloc] initWithURL:currentURL options:nil]; AVAssetImageGenerator *ima = [[AVAssetImageGenerator alloc] initWithAsset:as]; ima.appliesPrefernetworkingTrackTransform = YES; NSError *err = NULL; CMTime time = CMTimeMake(1, 24); CGImageRef imgRef = [ima copyCGImageAtTime:time actualTime:NULL error:&err]; UIImage *thumbnail = [[UIImage alloc] initWithCGImage:imgRef]; dispatch_async(dispatch_get_main_queue(), ^{ UIImageView *backgroundImage = [[UIImageView alloc]initWithFrame:buttonFrame]; backgroundImage.image = thumbnail; backgroundImage.layer.opacity = 0; [self.videoScrollView addSubview:backgroundImage]; [self.videoScrollView sendSubviewToBack:backgroundImage]; [UIView animateWithDuration:0.5 delay:0.0 options: UIViewAnimationOptionCurveEaseInOut animations:^{ backgroundImage.layer.opacity = 1; } completion:^(BOOL finished){}]; }); }); //add title to the screen caps //draw the button } 

Estoy en Xcode 5, probando un nuevo dispositivo con iOS 7. Soy autodidacta, así que estoy seguro de que he recogido mi parte justa de malos hábitos, pero espero haber perdido algo obvio que alguien con un poco más de experiencia se recuperará.

He intentado una buena cantidad de búsquedas en Google y busqué en el desbordamiento de stack, y he intentado mirar diagnósticos, loggings y perfiles de memory para aislar más el problema, sin éxito.

¡Cualquier ayuda sería muy apreciada!

Editar :

Cómo reproducir el error:

  1. Ir a la list de videos
  2. Dejar list de videos
  3. Repetir 1 + 2 4 o 5 veces provoca el choque

Paso 2. simplemente elimina todo el scrollView de su supervista y luego lo vuelve a dibujar. Entiendo que no es necesario volver a dibujar la list de videos cada vez que vuelves, pero estoy haciendo esto por una razón determinada y no creo que esta sea la fuente del problema (podría estar equivocado).

Editar 2 :

Aquí hay una image del perfil de memory: introduzca la descripción de la imagen aquí

El código que muestra tiene una gran pérdida. Está creando un object Core Foundation con:

 CGImageRef imgRef = [ima copyCGImageAtTime:time actualTime:NULL error:&err]; 

Sin embargo, no veo CFRelease correspondiente.

Tu código debería ser:

 CGImageRef imgRef = [ima copyCGImageAtTime:time actualTime:NULL error:&err]; UIImage *thumbnail = [[UIImage alloc] initWithCGImage:imgRef]; CFRelease(imgRef); 

Bien, entonces encontré una solución decente. Todavía no estoy del todo seguro de por qué esto era un problema en primer lugar, pero tengo algunas sospechas.

Creo que el process de generar una miniatura fue demasiado intenso como para repetirlo en un hilo en un bucle for. Tuve este presentimiento, y decidí ajustar el código anterior. En lugar de generar una nueva miniatura cada vez, saveía las capturas de pantalla recién generadas como un png en el directory de inicio de los documentos. Entonces, la próxima vez, cargaría este recurso desde allí. Esto causó que los problemas de memory se desvanecieran.

Espero que esto ayude a alguien con un problema similar, y si alguien tiene algo que agregar o una mejor respuesta, todos los oídos.