5

estoy añadiendo un CAKeyframeAnimation a la capa de un ImageView para la representación de la animación de una imagen:Extracción CAKeyframeAnimation no libera la memoria

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"contents"]; 
animation.values = arrayOfImages; 
[animation setRemovedOnCompletion:YES]; 
animation.delegate = self; 
[animation setValue:delegate forKey:@"AnimatedImageViewDelegate"]; 
animation.repeatCount = repeatCount; 
animation.fillMode = kCAFillModeForwards; 
animation.calculationMode = kCAAnimationDiscrete; 
[animation setValue:animationName forKey:@"name"]; 

Cuando quiero iniciar la animación que llamo:

animation.duration = duration; 
[self.layer addAnimation:animation forKey:animationName]; 
[self.layer setContents:[animation.values lastObject]]; 

Cuando termina la animación, quiero eliminarla por completo y liberar su memoria.

[self.layer removeAllAnimations];  
[self.layer removeAnimationForKey:animationName]; 

Hacer esto, y el uso de instrumentos-Activity Monitor, la memoria no se relased menos suelto el imageView completa.

¿Cómo puedo liberar esa memoria de animación sin destruir el UIImageView ???

+0

puede intentar llevarlo a autoreleasepool – SAKrisT

Respuesta

0

Está utilizando el método de conveniencia para crear una instancia del objeto. Por lo tanto, no tendrá control sobre cuándo se libera realmente el objeto. Para tener control sobre eso, tendrá que alloc el objeto y dealloc usted mismo:

crear la instancia:

CAKeyframeAnimation *animation = [[CAKeyframeAnimation alloc] init]; 

Luego, después de la animación terminada la llamada después de que sus líneas retirar:

[animation release]; 
+0

'[CAKeyframeAnimation animationWithKeyPath:]' devuelve un objeto liberado automáticamente (según la convención de nomenclatura) y no parece retenerlo (al menos no lo está haciendo en el código que ha presentado) entonces él debería estar bien. Hacer 'alloc/release' en cambio no cambiará eso. De hecho, de su código diría que todo está absolutamente bien, por lo que el problema debe ser en otro lugar. – DarkDust

+0

Es cierto, excepto que no tiene control cuando se libera cuando se libera automáticamente. Parece que se está liberando automáticamente cuando se destruye la vista, por lo que parece que al menos vale la pena intentarlo. –

+0

Incluso al hacer la animación alloc/init y release, la memoria no disminuye cuando uso Activity Monitor. Entonces, no hay diferencia en términos de memoria usando liberación automática o lanzamiento. Si comento la línea animation.values ​​= arrayOfImages; la animación no se muestra y la memoria no aumenta, así que mi problema es que, cuando finaliza la animación, la memoria no se libera a menos que publique ImageView. – nano

0

En primer lugar, si se trata de un proyecto de iOS 5, ARC debería gestionar sus lanzamientos por usted, ¡lo que es realmente agradable!

Ahora - Usé muchas animaciones en mi proyecto y noté estallidos similares en el montón. Supongo que CA almacena en caché mucho de lo que está animado internamente. Para confirmar los elementos de hecho están siendo autoreleased Recomiendo la creación de una prueba de asignaciones o las pérdidas por medio de la herramienta de instrumentos y haga lo siguiente:

  1. determinar una situación en la que activaría y la animación.
  2. Marque el montón una vez completada la animación.
  3. Dispara algo que te lleve a otra vista donde los objetos deberían haberse eliminado.
  4. Repita el proceso en los pasos 1-2-3 tantas veces como desee. Normalmente lo hago unas 10 veces más o menos.

Eso es todo ... básicamente animar - marcar - deshacer - animar - marcar. ¡Debería ver que los disparos disminuyen a 0 o casi a 0 si CoreAnimation libera objetos automáticamente!

Para obtener más información sobre cómo comprobar como éste echar un vistazo a este artículo:

http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/

+0

Gracias por su respuesta. Disminuye a casi 0 una vez que termina la animación, pero solo si lanzo ImageView. Sin liberarlo, los crecimientos del montón son bastante altos (de 40 KB a 800 KB cada vez). Eso significa que CoreAnimation no se publicará cuando termine. – nano

0

Tengo mismo problema acerca de la memoria con CAKeyframeAnimation cuando los valores de ajuste = array de imágenes. Y veo que el problema que tengo es que las imágenes están insertadas por [UIImage imagewithname:] que está en la memoria caché por defecto. Así que mi solución es cambiar para usar [UIImage imageWithContentsOfFile:] Espero que esto sea útil.

Cuestiones relacionadas