如何在Swift中从图像数组中释放图像

时间:2017-12-10 04:46:43

标签: ios swift

是否有核选择'从图像阵列中释放图像?我想播放第一个animation1(ImageSet1),然后在完成块中删除这个动画,然后加载并播放第二个animation2(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")

最后调用animate函数

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

}) 
}

在完成块之后,我将animation1数组设置为[]并且它确实删除了动画(你不能再看到它)但是内存占用仍然完全相同(我也试过了另一个)三个选项)。

通过以上所述,内存占用空间不断增加。每次我添加下一个动画时它最终会导致操作系统终止App

即使更改ViewControllers,数组仍然将图像保存在内存中

感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

UIImage(命名:)将始终将图像保存在内存堆栈中,除非需要更多内存和足够的时间来解除分配。

为了从内存中释放图像,您应该使用其他构造函数:UIImage(contentsOfFile :)并将图像保存在文件夹而不是资源管理器中。也许数据会起作用,但我不确定。

临时/大型资源将消耗堆,您应该使用“临时保存”方法(如contentsOfFile)将其从内存中清除。