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,这可以节省大量内存。
我有一个包含多个保存在数组中的 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,这可以节省大量内存。