我有一个ViewController,其中包含了填充整个vc的imageView子视图,当我提出新的VC并解散旧的VC时,会调用oldVC,但内存仍然存在并且仪器显示我是与imageio相关的,主要问题是为什么devit的oldvc被调用,但图像reamins在内存..这是我的oldvc代码:
class Vc1: UIViewController {
@IBOutlet weak var vcimage: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
vcimage.image = UIImage.init(named: "splash")
// Do any additional setup after loading the view.
}
@IBAction func tovc2(_ sender: Any) {
let vc = self.storyboard?.instantiateViewController(withIdentifier: "vc2")
AnimateTovc(ViewControllerToAnimate: vc!, vctoDissmiss: self)
}
override func didReceiveMemoryWarning() {
print("memory warning")
}
func AnimateTovc(duration:Float = 0.5,Animateoption:UIViewAnimationOptions = .transitionFlipFromLeft,ViewControllerToAnimate vc:UIViewController,vctoDissmiss: UIViewController?,completion : @escaping ()->Void = {} ){
let appDelegate = UIApplication.shared.delegate as! AppDelegate
UIView.transition(with: appDelegate.window!, duration: TimeInterval(duration), options: Animateoption , animations: { () -> Void in
appDelegate.window!.rootViewController = vc
}, completion:{ isfinished in
completion()
vctoDissmiss?.dismiss(animated: false, completion: nil)
})
}
deinit {
print("removed \(self) from memory")
}
}
奇怪的部分是当app进入后台并且imageio部分从内存释放时,内存在newvc中被释放。
答案 0 :(得分:1)
感谢Allen,使用UIImage(contentsOfFile:)
解决了这个问题。
根据Apple文档:
使用init(named:in:compatibleWith :)方法(或init(命名:)方法)从位于应用程序主包(或其他已知包)中的图像资源或图像文件创建图像。由于这些方法会自动缓存图像数据,因此特别推荐用于经常使用的图像。
使用imageWithContentsOfFile:或init(contentsOfFile :)方法 创建一个图像对象,其中初始数据不在捆绑中。 这些方法每次都会从磁盘加载图像数据,因此您应该这样做 不要用它们重复加载相同的图像。