2017-02-27 23 views
0

タブバコントローラプロジェクトのビューコントローラからメモリを解放(解放)する方法と、両方のビューコントローラを呼び出さない方法が必要です。私はそれはそれはメモリ内にあり、それをビューコントローラから即座にメモリを解放する方法

を解放しないで私を見るのです楽器ツールを使用し、次は、ビューコントローラ タップアプリケーションの最初のビューコントローラである、両方のために私のコードです:

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) 


    } 

} 

とタップアプリケーションで同じプロジェクトで2番目のビューコントローラは以下の通りである:あなたがコードを試してみて、deinitメソッドが呼び出さないで見ることができます

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



} 

強参照、メモリをリークする間違ったコードはいつですか?これらのビューコントローラからメモリを解放することはできませんか?

答えて

0

私は 午前はviewWillDisappear(からのビューコントローラの参照を取得し、それを解決)

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

、あなたのようにビューコントローラを解放したい場合deinitを呼び出し

+0

いいえ、これはView Controllerの別のインスタンスを作成することであり、 'deinit'が呼び出されているのが見えています。しかし、オリジナルのView Controllerのインスタンスは、まだメモリ内に息づいています。 – Rob

0

ビューコントローラはタブバービューコントローラで表示されるため、タブバービューコントローラは割り当て解除されるまでビューコントローラを参照します。

タブバービューコントローラを別のものに置き換えて、ビューコントローラが解放されるようにすることができます。

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

上記の行が実行された後、deinitの両方を呼び出す必要があります。

+0

このコードを入力していただきありがとうございます。ビューでは消えますか? – Mustafa

+0

それは両方の私は、私はビューのコントローラを残しておく必要があります初期化だけです – Mustafa

+0

私はタブバーにビューコントローラを設定する場合、それはどのように私はまだビューコントローラとタブバーを使用してビューコントローラお願いします? – Mustafa

0

あるので、ゼロに設定しますタブを使用するのではなく、タブを使用する必要があります。また、タブを選択するときに子ビューコントローラを追加または削除するために、コントローラの包含呼び出しを表示します。

しかし、もっと深い疑問は、なぜあなたはそのすべてを通過したいのですか?ビューコントローラで使用されるメモリの量はごくわずかです。メモリの問題を解決しようとしている場合、膨大な量のメモリを占有しているものを特定し、ビューコントローラではなくviewDidDisappearにしかリリースしないでください。

関連する問題