如何在swift中从视图控制器释放内存

时间:2017-02-27 07:50:39

标签: swift memory-management memory-leaks

我需要知道如何从标签栏控制器项目中的视图控制器中释放(释放/释放)内存,deinit方法不会调用两个视图控制器。我使用仪器工具,它告诉我它在内存中而不是免费的

以下是我的两个视图控制器的代码 tapped应用程序中的第一个视图控制器是:

import UIKit

class WebViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    deinit {
        print("web view controller is De init")
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        self.dismiss(animated: true, completion: nil)


    }

}

和tapped应用程序中同一项目中的第二个视图控制器如下:

import UIKit

class MovieDownloadingViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        self.dismiss(animated: true, completion: nil)

    }

    deinit {
        print("Movie Downloading View Controller is De init")
    }



}

您可以尝试代码并查看deinit方法而不是调用

请问何时是强引用,错误的代码泄漏内存,以便它不能从这些视图控制器释放内存?

3 个答案:

答案 0 :(得分:2)

如果要在选择选项卡时释放视图控制器,则不应使用选项卡栏控制器,而应自行滚动(使用选项卡视图,并查看控制器包含调用以添加和删除子视图控制器当你选择标签时。)

但更深层次的问题是,为什么要完成所有这些?视图控制器使用的内存量可以忽略不计。如果您正在尝试解决内存问题,请确定占用大量内存的内容,并在viewDidDisappear中仅释放该内存而不是视图控制器。

答案 1 :(得分:1)

由于视图控制器由标签栏视图控制器显示,因此标签栏视图控制器将保留对它们的引用,直到它被取消分配。

您可以尝试用其他内容替换标签栏视图控制器,以便查看您的视图控制器。

UIApplication.shared.delegate?.window?.rootViewController = UIViewController()

执行上述行后,应调用deinit

答案 2 :(得分:0)

我解决了 我从viewWillDisappear()

获取视图控制器的引用
SELECT DATE(`Date`), 
        iDriverkey,
        MIN(IF(Status = 1, TIME(`Date`), NULL)) AS `Start`,
        MAX(IF(Status = 2, TIME(`Date`), NULL)) AS `Stop`
FROM somedatatable
GROUP BY DATE(`Date`), 
        iDriverkey

并将其设置为nil,以便deinit调用