当我在Swift中销毁我的对象时,它不会释放我的RAM内存

Jos*_*dan 4 memory iphone xcode swift

这是一个测试,一个创建动作和一个破坏对象的动作,但是当我摧毁它时,我的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
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*ier 20

UIImage(named:)缓存图像.在收到内存警告之前,这些内容不会被释放.也就是说,即使你的应用程序处于后台,它们也会在那时自动释放(如果你在后台发出警告,通常你没有机会减少内存).缓存使用NSPurgableData,这就是为什么它可以做到这一点.缓存清除非常聪明.它将删除数据,但保留文件信息,因此下次访问图像时,它将自动重新加载,您将永远不会注意到图像已从内存中清除(除了小的加载延迟) .iOS也可以在没有显示的情况下随时卸载缓存的图像,但我不知道任何文档可以准确地解释何时会发生.

如果您甚至有可能再次需要此图像,则应将其保留在缓存中.从磁盘读取是非常昂贵的,Apple会为您提供缓存以帮助您避免这种成本.但是,如果您不太可能再次显示此图像,则可以通过使用UIImage(contentsOfFile:)来避免缓存.这不会缓存图像.尽管Apple会为您清除缓存,但如果不必要,可以避免创建内存警告.