【发布时间】:2017-12-14 00:01:50
【问题描述】:
在阅读了一些关于 SO 和其他文章的答案(见下文)后,当您将多个图像加载到动画数组中时,管理内存的最佳方法是什么?
http://www.alexcurylo.com/2009/01/13/imagenamed-is-evil/
这是我的目标:
- 创建动画数组(见下面的代码)
- 动画播放后刷新缓存并加载另一个动画(冲洗、清洗、重复,你懂的:)
正如苹果所说 https://forums.developer.apple.com/thread/17888
使用UIImage(named: imageName) 缓存图像,但在我的情况下,在连续播放 2-3 个动画后,iOS 会终止应用程序(操作系统不会响应内存不足警告而是终止应用程序 - 见代码结尾下面)
我不想缓存图像,我们也可以:
- 每次动画完成时刷新内存,然后加载新动画;或
- 当用户移动到新场景时刷新内存
这是我的代码:
// create the Animation Array for each animation
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)! // here is where we need to address memory and not cache the images
//let image = UIImage(contentsOfFile: imageName)! // maybe this?
imageArray.append(image)
}
return imageArray
}
// here we set the animate function values
func animate(imageView: UIImageView, images: [UIImage]){
imageView.animationImages = images
imageView.animationDuration = 1.5
imageView.animationRepeatCount = 1
imageView.startAnimating()
}
// Here we call the animate function
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
//self.animationView.image = nil // Maybe we try the following?
//self.animationView.removeFromSuperview()
//self.animationView = nil
})
}
根据 SO 响应,看起来这可能是防止图像被缓存的最佳方法,但它似乎在我的代码中不起作用:
let image = UIImage(contentsOfFile: imageName)!
我也试过了,但似乎也不起作用:
func applicationDidReceiveMemoryWarning(application: UIApplication) {
NSURLCache.sharedURLCache().removeAllCachedResponses()
}
我还在完成块中尝试了以下文章 (removeFromSuperview),但我也无法让它工作(请参阅上面的代码):
https://www.hackingwithswift.com/example-code/uikit/how-to-animate-views-using-animatewithduration
新代码:
// create the Animation Array for each animation
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)! // replaced with your code below
if let imagePath = Bundle.mainBundle.path(forResource: "ImageSet1" ofType: "png"),
let image = UIImage(contentsOfFile: imagePath) {
//Your image has been loaded }
imageArray.append(image)
}
return imageArray }
【问题讨论】:
-
你说:“但它似乎在我的代码中不起作用”。你是什么意思?你还在被终止吗?你看不到动画吗?
-
嗨@AndreaMugnaini - 我已经尝试了各种文章中的建议答案(请参阅标有 // 的 cmets)但是是的,我仍然被终止。动画效果很好,但是当我添加每个额外的动画时,整体内存使用量会增加。我以为我可以简单地使用 self.animationView.removeFromSuperview() 刷新动画,但这似乎也不起作用(内存保持不变)。希望这有助于澄清
-
您可以检查一下您的 png 文件大小吗?
-
嗨@AndreaMugnaini - png 文件的平均大小为 100kbs