ViewController deinit后,UIImageView上的内存泄漏

时间:2018-03-09 21:41:17

标签: ios swift memory-leaks uiimageview

我有一个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中被释放。

1 个答案:

答案 0 :(得分:1)

感谢Allen,使用UIImage(contentsOfFile:)解决了这个问题。

根据Apple文档:

  

使用init(named:in:compatibleWith :)方法(或init(命名:)方法)从位于应用程序主包(或其他已知包)中的图像资源或图像文件创建图像。由于这些方法会自动缓存图像数据,因此特别推荐用于经常使用的图像。

     

使用imageWithContentsOfFile:或init(contentsOfFile :)方法   创建一个图像对象,其中初始数据不在捆绑中。   这些方法每次都会从磁盘加载图像数据,因此您应该这样做   不要用它们重复加载相同的图像。