我有一个滚动视图,其中包含保存在数组中的多个UIImageView。这些UIImageViews中的每一个都有相同的背景图像,但有一个唯一的掩码。当这些图像没有显示在屏幕上时,我想去掉掩码以节省内存。当必须创建或删除遮罩时,会调用如下函数。然而,在这种情况下,当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
}
}
如何解决这个问题?作为一个初学者,我已经寻找答案好几天了,任何帮助都将不胜感激。
代码中最大的对象是用作掩码的UIImageView的image
的UIImage。(UIImageView本身可以忽略不计。(通过说UIImage(named:)
加载的UIImages被缓存;因此,删除UIImageView不会导致内存减少。但好消息是,下次执行此操作时,图像已经缓存,因此内存也不会增加。
还要注意的是,如果UIImage很大,那么它的内存也会很大,即使您将其显示得很小(即,如果您正在使UIImageView将UIImage大小缩小到自己的大小(。这是对记忆的巨大浪费。有一些标准技术可以按照显示所需的实际大小加载或重新绘制UIImage,这可以节省大量内存。
请注意,UIImage(名为:(的文档指出,它确实缓存了加载的图像。因此,除非你收到内存警告,否则取消设置图像不会减少内存消耗;图像仍在高速缓存中。如果确实不需要缓存,请使用其他不缓存的初始化,如init(data:(或init(contentsOfFile:(。