Как снимать изображения из массива изображений в Swift

Есть ли "ядерная опция" для выпуска изображений из массива изображений? Я хотел бы воспроизвести первый анимационный файл1 (ImageSet1), затем в блоке завершения удалить эту анимацию, а затем загрузить и воспроизвести вторую анимацию2 (ImageSet2) и т.д.: Стирать, полоскать, повторять - вы ее получите:)

Сначала я определяю переменные экземпляра моего ViewController:

var animation1: [UIImage] = []
var animation2: [UIImage] = []
var animation3: [UIImage] = []

Затем я создаю анимационный массив для каждой анимации:

func createImageArray(total: Int, imagePrefix: String) -> [UIImage]{
    var imageArray: [UIImage] = []
    for imageCount in 0..<total {
    let imageName = "\(imagePrefix)-\(imageCount).png"
    let image = UIImage(named: imageName)!
    imageArray.append(image)
    }
    return imageArray
    }

Затем я устанавливаю значения анимации:

func animate(imageView: UIImageView, images: [UIImage]){
    imageView.animationImages = images
    imageView.animationDuration = 1.5
    imageView.animationRepeatCount = 1
    imageView.startAnimating() }

    animation1 = createImageArray(total: 28, imagePrefix: "ImageSet1")
    animation2 = createImageArray(total: 53, imagePrefix: "ImageSet2")
    animation3 = createImageArray(total: 25, imagePrefix: "ImageSet3")

И, наконец, вызовите функцию анимации

func showAnimation() {
    UIView.animate(withDuration: 1, animations: {
        animate(imageView: self.animationView, images: self.animation1)

        }, completion: { (true) in

        // Release the Images from the Array

        })
    }

Я хотел бы выпустить изображения из массива изображений в блоке завершения, чтобы уменьшить объем памяти, но я не могу заставить это работать, я попробовал все четыре примера ниже, но нет никакого эффекта на объем памяти:

func showAnimation() { 
UIView.animate(withDuration: 1, animations: { 
animate(imageView: self.animationView, images: self.animation1) 

}, completion: { (true) in 

self.animation1 = [] // is this correct?
self.animationView.image = nil // also doesn't work
self.animationView.removeFromSuperview() // also doesn't work
self.animation1 = nil // also doesn't work

}) 
}

После блока завершения я установил массив анимации равным [], и он удалит анимацию (вы больше не видите ее), но след памяти остается тем же (я также пробовал другие три варианта также).

С вышесказанным, объем памяти "удары" каждый раз, когда я добавляю следующую анимацию, и в конечном итоге приводит к тому, что ОС завершает приложение

Даже когда вы меняете ViewControllers, массив все еще держит изображения в памяти

Спасибо за любую помощь:)

Ответ 1

UIImage (named:) всегда сохраняет изображение в стеке памяти, если не требуется больше памяти и достаточно времени для освобождения.

Чтобы освободить изображения из памяти, вы должны использовать другой конструктор: UIImage (contentsOfFile:) и сохранить изображения в папке вместо менеджера Asset. Возможно, данные будут работать, но я не уверен.

Временные/Большие ресурсы будут потреблять кучу, вам следует использовать методы "temp save", такие как contentsOfFile, чтобы удалить их из памяти.