图像阵列导致内存问题

Posted

技术标签:

【中文标题】图像阵列导致内存问题【英文标题】:Image Array Causing memory Issue 【发布时间】:2017-07-11 04:00:51 【问题描述】:

目前正在创建一个基本的图像幻灯片应用程序,为此我创建了一个 UIImage 数组并使用以下代码调用它们。

let imageNames = (0...50).map
    
        "\($0).JPG"
    
    let image = UIImage(named: imageNames[0])

    imageView.animationImages = image

    imageView.animationDuration = 50
    imageView.startAnimating()

想知道是否有人可以提供一些建议。

【问题讨论】:

为什么要输入 50 个数字? let images = (0...55).map UIImage(named: "\($0).JPG")! 你的图片是不是尺寸小但分辨率大? 【参考方案1】:

问题不在于图像在磁盘上占用了多少内存,而在于解决屏幕上所有像素所需的内存。在使用图像之前,您实际上并不需要存储它们。一张小于 1MB 的图片会很快加载。

相反,您只需要保留图像的路径,并且只有当您到达显示图像的代码时,才加载并显示它。

因此,结合 Alexander 和 KKRocks 的正确答案:

在你的类的顶部,定义你的文件名数组:

let imageNames = (0...55).map  "\($0).JPG" 

你在哪里展示你的图片:

if let image = UIImage(named: images[0]) 
   ... the code that is blowing up ...

如果您不确定如何保存和检索文件,请参阅我最近就该主题给出的答案:

Saving and Retrieving Files in User's Space.

【讨论】:

感谢 Mozahler 的回复,我尝试在其中添加代码,但出现错误:“无法将 'UIImage' 类型的值转换为预期的参数类型 'String' 一行: '让 image = UIImage(named:images[0]) 对不起,是我的错。我编辑了有问题的行。我将数组的名称从 image 更改为 imageNames,以明确它包含文件名。 感谢您的快速回复,不幸的是我仍然遇到同样的问题。目前代码如下: let imageNames = (0...50).map UIImage(named: "($0).JPG")! let image = UIImage(named: imageNames[0]) imageView.animationImages =图像 imageView.animationDuration = 50 imageView.startAnimating() 不,这是不对的。 map 语句不应该创建图像,它应该创建文件名。您想创建一个名称数组,并且仅在要显示图像时才创建图像。最好在添加代码时编辑问题。每个人都很难在 cmets 中阅读,他们甚至可能不会阅读 cmets。 感谢您的评论,现在将代码修改为原来的样子。但是仍然有错误:“无法分配'UIImage'类型的值?'输入“[UIImage]?”在 imageView.animationImages = images【参考方案2】:

您需要在数组中添加图像名称而不是 UIImage 。

let images: [String] = [
        "0.JPG",
         "1.JPG")!]

从数组字符串中获取图片

let image = UIImage(named: images[0])

【讨论】:

以上是关于图像阵列导致内存问题的主要内容,如果未能解决你的问题,请参考以下文章

如何为图像使用托管(统一)内存?

OpenCV 图像阵列,4D 矩阵

在 UITesting 期间导致内存警告和崩溃的背景图像

并行调整图像大小导致内存不足异常

iOS - 调整图像大小导致内存泄漏

从 PHAssets Array 请求图像导致内存异常