这是一个测试,一个创建动作和一个破坏对象的动作,但当我销毁它时,我的RAM仍然使用相同数量的内存(大约 30mb )。
var missileImage: UIImageView!
weak var img: UIImage!
@IBAction func createImg(sender: AnyObject) {
missileImage = UIImageView(frame: CGRectMake(CGFloat(arc4random() % 100), 200, 50, 30))
img = UIImage(named: "house.jpg")
missileImage.image = img
missileImage.tag = 10001
self.view.addSubview(missileImage)
}
@IBAction func destroyImg(sender: AnyObject) {
self.view.viewWithTag(10001)?.removeFromSuperview()
img = nil
missileImage = nil
}
答案 0 :(得分:20)
UIImage(named:)
缓存图片。在收到内存警告之前,这些都不会被释放。也就是说,即使您的应用程序处于后台,它们也会在那时自动发布(如果您在后台发出警告,通常情况下您没有机会减少内存)。缓存使用NSPurgableData
,这就是它可以执行此操作的原因。缓存清除非常聪明。它将删除数据,但保留文件信息,因此下次访问图像时,它会自动重新加载,并且您永远不会注意到图像已从内存中清除(除了小负载延迟)。 iOS也可以随时卸载缓存的图像,但我不知道任何文档可以准确解释何时会发生这种情况。
如果您甚至有可能再次需要此图像,则应将其保留在缓存中。从磁盘读取是非常昂贵的,Apple会为您提供缓存以帮助您避免这种成本。但是,如果您不太可能再次显示此图像,则可以使用UIImage(contentsOfFile:)
来避免缓存。这不会缓存图像。尽管Apple会为您清除缓存,但如果它们不必要,可以避免创建内存警告。