簡體   English   中英

更改根視圖控制器不會取消分配同一窗口上的先前視圖控制器

[英]Changing the root view controller is not deallocating the previous view controllers on the same window

我的應用程序使用初始視圖控制器啟動(我們將其稱為StartVC )。 現在,當用戶按下繼續按鈕時,我將在StartVC之上呈現一個導航堆棧(我們將其稱為RegisterVC )。 這個導航堆棧將包含5個視圖控制器,當用戶使用按鈕操作向前移動時,我正在推動它。 在第5個視圖控制器之后,我正在啟動一個新的導航堆棧(我們將其稱為LoginVC )。

現在我的用例是我不希望StartVCRegisterVC駐留在內存中,因為一旦用戶完成注冊它們就沒用了。 為了實現這一點,我將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM