代码之家  ›  专栏  ›  技术社区  ›  mohammad_Z74

ViewController取消初始化后UIImageView上的内存泄漏

  •  2
  • mohammad_Z74  · 技术社区  · 6 年前

    我有一个ViewController,它的子视图imageView填充了整个vc,当我呈现新vc并去掉旧vc时,调用了旧vc的deinit,但内存仍然存在,仪器显示我与imageio有关,主要问题是为什么调用了旧vc的deinit,但内存中出现了图像。。这是我的旧VC代码:

    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")
    }
    }
    

    奇怪的是,在newvc中,当应用程序进入后台时,内存被释放,imageio部分从内存中释放。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Nordeast mohammad_Z74    6 年前

    感谢Allen,通过使用 UIImage(contentsOfFile:)

    根据苹果文档:

    使用init(名为:in:compatibleWith:)方法(或init(名为:)方法)从位于应用程序主捆绑包(或其他已知捆绑包)中的图像资产或图像文件创建图像。由于这些方法会自动缓存图像数据,因此特别建议您使用频繁的图像使用这些方法。

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