[英]Changing the root view controller is not deallocating the previous view controllers on the same window
我的應用程序使用初始視圖控制器啟動(我們將其稱為StartVC )。 現在,當用戶按下繼續按鈕時,我將在StartVC之上呈現一個導航堆棧(我們將其稱為RegisterVC )。 這個導航堆棧將包含5個視圖控制器,當用戶使用按鈕操作向前移動時,我正在推動它。 在第5個視圖控制器之后,我正在啟動一個新的導航堆棧(我們將其稱為LoginVC )。
現在我的用例是我不希望StartVC和RegisterVC駐留在內存中,因為一旦用戶完成注冊它們就沒用了。 為了實現這一點,我將AppDelegate窗口的根視圖控制器更改為LoginVC
以下是我在RegisterVC的第5個視圖控制器上嘗試的選項:
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)在分配新的根視圖控制器之前將其作為nil。
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = nil
appDelegate.window?.rootViewController = LoginVC
appDelegate.window?.makeKeyAndVisible()
4)我也直接從AppDelegate嘗試了上述選項,而不是從第5個視圖控制器執行。
通過以上所有選項,我嘗試通過查看所有視圖控制器上的deinit進行調試,但沒有一個被解除分配。 另外,我可以在xcode Debug View Hierarchy中看到LoginVC下的第5個視圖控制器。
由於沒有從內存中刪除它們,我面臨的實際問題是在呈現LoginVC之后 ,我有一個視圖控制器,其背景顏色alpha較小。 因此,我看到它下面的RegisterVC第五視圖控制器。
任何有關這方面的幫助...
我認為rootViewController設置不是問題。 也許您在其他視圖控制器中有一個保留周期,可以阻止它們被釋放。
有很多方法你可能會意外地做到這一點(在塊中捕獲對self的強引用,而不是將委托或其他后引用標記為弱等)。
您可以用儀器來解決這個問題。 這是一個教程: http : //samwize.com/2016/05/30/finding-retain-cycle-with-instruments/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.