Swift 4 正确摘下口罩

Swift 4 correctly remove mask

我有一个包含多个保存在数组中的 UIImageView 的滚动视图。这些 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
    }
 }

如何解决这个问题?作为初学者,我已经寻找答案好几天了,非常感谢任何帮助。

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

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

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