-1

我有一个包含多个 UIImageViews 的滚动视图,这些 UIImageViews 保存在一个数组中。这些 UIImageView 中的每一个都具有相同的背景图像,但具有唯一的掩码。当这些图像没有显示在屏幕上时,我想移除遮罩以节省内存。当必须创建或删除掩码时,会调用如下函数。然而,在这种情况下,当 imageView 掩码设置为 nil 时,内存占用不会减少。

func updateView(imageName: String, imageView: UIImageView, show: Bool)
    if show {
       let newMask = UIImageView()
       newMask.image = UIImage(named: imageName)
       newMask.frame = frame
       imageView.mask = newMask
    } else {
       imageView.mask = nil
    }
 }

如何解决这个问题呢?作为一个初学者,我几天来一直在寻找答案,非常感谢任何帮助。

4

2 回答 2

1

代码中最大的对象是您image用作掩码的 UIImageView 的 UIImage。(UIImageView 本身可以忽略不计。)通过说加载的 UIImagesUIImage(named:)缓存;因此,删除 UIImageView 不会导致内存减少。但好消息是,下次执行此操作时,图像已被缓存,因此内存也不会增加。

还要注意,如果 UIImage 很大,它的内存也会很大,即使你显示它很小(即,如果你让 UIImageView 做将 UIImage 大小减小到它自己大小的工作)。这是对内存的巨大浪费。有一些标准技术可以以显示所需的实际大小加载或重绘 UIImage,这可以大量节省内存。

于 2018-12-04T20:44:55.170 回答
0

请注意,UIImage(named:)的文档指出它确实缓存了它加载的图像。因此,除非您收到内存警告,否则取消设置图像不会减少内存消耗;图像仍在缓存中。如果您真的不想缓存,请使用其他不缓存的初始化之一,例如 init(data:) 或 init(contentsOfFile:)。

于 2018-12-04T20:43:28.230 回答