2017-07-16 74 views
1

我的應用程序啓動時使用初始視圖控制器(我們稱之爲StartVC)。現在,當用戶按下繼續按鈕時,我將在StartVC之上呈現一個導航堆棧(可稱爲RegisterVC)。這個導航堆棧將包含5個視圖控制器,每當用戶向前移動按鈕操作時,我都會按下它。在第五個視圖控制器之後,我開始一個新的導航堆棧(我們稱之爲LoginVC)。更改根視圖控制器不會釋放同一個窗口上的先前視圖控制器

現在我的使用情況是我不想讓StartVC & RegisterVC駐留在內存,因爲它們是沒有用的,一旦用戶完成註冊。爲了實現這一點,我改變了AppDelegate中窗口的根視圖控制器LoginVC

下面是我試過的RegisterVC第五視圖控制器上的選項:更改keywindow

1)

UIApplication.shared.keyWindow?.rootViewController = LoginVC 
    UIApplication.shared.keyWindow?.makeKeyAndVisible() 

2)更改窗口

let appDelegate = UIApplication.shared.delegate as! AppDelegate 
    appDelegate.window?.rootViewController = LoginVC 
    appDelegate.window?.makeKeyAndVisible() 

3)將前一個根視圖控制器設置爲零,然後分配一個新視圖控制器。

let appDelegate = UIApplication.shared.delegate as! AppDelegate 
    appDelegate.window?.rootViewController = nil 
    appDelegate.window?.rootViewController = LoginVC 
    appDelegate.window?.makeKeyAndVisible() 

4)我也嘗試了直接從AppDelegate的上述選項,而不是從第五個視圖控制器做它。

以上所有的選項,我試着通過在所有視圖控制器上查看deinit進行調試,但是沒有一個被取消分配。另外,我可以在xcode Debug View Hierarchy中看到LoginVC下的第五個視圖控制器。

由於沒有從內存中刪除它們,我面臨的實際問題是在呈現LoginVC之後,我有一個視圖控制器,其背景色alpha更少。正因爲如此,我在其下看到RegisterVC 5th視圖控制器。

對此讚賞的任何幫助...

+1

我建議使用[ 「調試內存圖」](https://stackoverflow.com/questions/30992338/how-to-debug-memory-leaks-when-leaks-instrument-does-not -show-them/30993476#30993476)功能,以查看對這些舊視圖控制器保持強大的參考。 – Rob

+0

你應該在這裏回答:http://stackoverflow.com/a/27153956/849645。如果你的問題與我的問題相同,這就爲我解決了問題。 – CMont

回答

1

我認爲rootViewController設置不是問題。也許你在其他視圖控制器中有一個保留週期,可以阻止它們被釋放。

有很多方法可能會意外地執行此操作(捕獲對塊中自身的強引用,不將代表或其他後引用標記爲弱等)。

你可能可以通過儀器找出它。這裏有一個教程:http://samwize.com/2016/05/30/finding-retain-cycle-with-instruments/

+0

或使用Rob的調試內存圖的建議(請參閱您的問題的評論) –

+0

是啊,看起來你們是對的,似乎有一個保留週期,但我無法找出它發生的地方......我跟着'調試內存圖表'和'工具',但沒有結束......我謹慎地管理內部關閉和'弱代理引用'中的'弱自我',但它仍然隱藏在某個地方......我會發現一次更新在哪裏發生......感謝您的快速回復。 – Venkat

+0

Hi @Venkat對此有何更新?我正面臨類似的問題,因爲前一個控制器在切換控制器時仍然可見。 –

-1

在設置新的根視圖控制器之前,刪除以前的根視圖控制器。

private func removePreviousViewController() { 
    let previousViewController = self.window?.rootViewController 
    previousViewController?.dismiss(animated: true, completion: { 
     previousViewController?.view.removeFromSuperview() 
    }) 
} 
相關問題