Libera memory en Swift en UIImage y UIImageViews

Estoy desarrollando una aplicación que consta de múltiples vistas. Cada vista contiene varias animaciones que están formadas por UIImageView.animate. El problema que tengo es que cada vez que abro una nueva memory de Vista no se networkinguce, está aumentando hasta 320 Mb en un iPhone 4, retonrando un error de memory "Terminado debido a un error de memory". No puedo encontrar cómo autorelease memory en Swift, ya que en Objective-C si pudiera ver es más recomendable usar imageWithContentOfFile en lugar de named: …

Yo uso esto para agregar image a un object UIImage:

var leftCorner: UIImage = UIImage(named: "navegacio_esquerra")! 

Para agregar una matriz de imágenes en UIImageView.animationImages utilizo esto:

 var thirdSisterHeadList: [Int] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 33, 32, 33, 34, 33, 32, 33, 34, 33, 32, 33, 34, 33, 32, 33, 34, 33, 66, 67, 68] var thirdSisterHeadImageList: [UIImage] = [] for i in thirdSisterHeadList{ var imageName = "pantalla_12_03_caps_c_\(i).png" thirdSisterHeadImageList += [UIImage(named: imageName)!] } thirdSisterHead.animationImages = thirdSisterHeadImageList 

Este comentario no tiene sentido.

No puedo encontrar cómo autorelease memory en Swift, ya que en Objective-C si pudiera ver es más recomendable usar imageWithContentOfFile en lugar de named :.

Swift y ObjC gestionan la memory de forma idéntica. Y para este tipo de trabajo, definitivamente querrías utilizar named: ya que permite que el sistema realice una administración de memory mucho mejor para ti. cuando la memory está apretada, puede purgar automáticamente las representaciones que no son necesarias.

Comienza con el instrumento de Asignaciones en Instrumentos. Asegúrate de que estas imágenes estén en realidad a donde se dirige tu memory. Es probable que sea el caso, pero con el perfil de memory, quiere datos, no conjeturas.

Estás usando las mismas imágenes más de una vez. Probablemente esté bien, pero debes validar que cada instancia de pantalla_12_03_caps_c_33.png es, de hecho, el mismo UIImage (esto debería funcionar automáticamente para ti, así que no sospecho fuertemente un problema aquí).

Para animar la image, va a querer que todos los desencryptions en la memory. Aun así, 320 MB para 30 imágenes en un iPhone 4 suena como mucho. Eso es ~ 10 MB por image. Una image de pantalla completa de iPhone 4 debería tener más de 2MB (640 * 960 * 4). Si está utilizando imágenes de muy alta resolución, es posible que desee proporcionar varias resoluciones para diferentes dispositivos, de modo que no tenga que lidiar con tantos datos que va a tirar.

El hecho de que la memory no se esté recuperando casi con certeza significa que su vista no se está liberando. Esto sugiere que tiene un bucle de retención, o quizás sigue llamando addSubview: para agregar una vista de image sin eliminar la vista de la image anterior (este es un error muy común). Sobrescribe dealloc en tu controller de vista y asegúrate de que se va cuando lo esperes. Asegúrese de que no se aferra a thirdSisterHead algún lugar fuera de este controller de vista.

Nota secundaria no relacionada: tu bucle for-in realmente está haciendo esto de manera difícil. Este código se puede simplificar y todas las variables se reemplazan con constantes, y se elimina la necesidad de crear un [UIImage] temporal para el += :

 let thirdSisterHeadList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 33, 32, 33, 34, 33, 32, 33, 34, 33, 32, 33, 34, 33, 32, 33, 34, 33, 66, 67, 68] let thirdSisterHeadImageList = thirdSisterHeadList.map { UIImage(named: "pantalla_12_03_caps_c_\($0).png")! } self.thirdSisterHead.animationImages = thirdSisterHeadImageList