我需要知道如何从标签栏控制器项目中的视图控制器中释放(释放/释放)内存,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方法而不是调用
请问何时是强引用,错误的代码泄漏内存,以便它不能从这些视图控制器释放内存?
答案 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调用