2017-02-27 94 views
0

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

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

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) 


    } 

} 

和在挖掘应用程序中的同一个项目第二视图控制器是:

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

我解决这个问题 上午得到从viewWillDisappear(视图控制器参考)

let sb = UIStoryboard(name: "Main", bundle: nil) 
     var vc = sb.instantiateViewController(withIdentifier: "Web") as? WebViewController 
     if vc != nil { 
      vc = nil 
     } 

,并将其设置为nil所以DEINIT是呼叫

+0

不,所有这些都是创建视图控制器的另一个实例,并且您看到它的'deinit'被调用。但原始视图控制器实例仍在内存中激荡。 – Rob

0

由于视图控制器是由标签栏视图控制器提供的,因此标签栏视图控制器将持有对它们的引用,直到它被释放为止。

你可以尝试用别的东西替换标签栏视图控制器来看你的视图控制器将被释放。

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

执行上述行后,应该调用您的deinit

+0

非常感谢你把这段代码放在哪里?鉴于将消失? – Mustafa

+0

它的初始化我需要当我离开视图控制器只有初始化 – Mustafa

+0

如果我将视图控制器设置为标签栏,它已被删除,所以我怎么能仍然使用视图控制器的标签栏没有强​​大的视图控制器参考请? – Mustafa

0

如果你想释放视图控制器作为您选择选项卡时,不应使用选项卡栏控制器,而应该自行调整(使用选项卡视图,并在选择选项卡时执行视图控制器包含调用以添加和删除子视图控制器)。

但更深层次的问题是为什么你想要通过所有这些?视图控制器使用的内存量可以忽略不计。如果您正在尝试解决内存问题,请在viewDidDisappear中找出占用大量内存的内容,然后只发布该内存,而不是视图控制器。