我的应用程序使用初始视图控制器启动(将其称为StartVC)。现在,当用户按下继续按钮时,我将在StartVC上方显示一个导航堆栈(将其称为RegisterVC)。这个导航堆栈将包含5个视图控制器,每当用户使用按钮动作向前移动时,我都会在其中推入该视图控制器。在第5个视图控制器之后,我将启动一个新的导航堆栈(将其称为LoginVC)。
现在,我的用例是我不希望StartVC和RegisterVC驻留在内存中,因为一旦用户完成注册,它们就没有用了。为了实现此目的,我将AppDelegate窗口的根视图控制器更改为LoginVC。
以下是我在RegisterVC的第五个视图控制器上尝试过的选项:
1)更改键盘窗口
UIApplication.shared.keyWindow?.rootViewController = LoginVC
UIApplication.shared.keyWindow?.makeKeyAndVisible()
Run Code Online (Sandbox Code Playgroud)
2)变更视窗
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = LoginVC
appDelegate.window?.makeKeyAndVisible()
Run Code Online (Sandbox Code Playgroud)
3)在分配新的根视图控制器之前,将其作为零。
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = nil
appDelegate.window?.rootViewController = LoginVC
appDelegate.window?.makeKeyAndVisible()
Run Code Online (Sandbox Code Playgroud)
4)我也直接从AppDelegate尝试了上述选项,而不是从第5个视图控制器进行尝试。
使用以上所有选项,我尝试通过在所有视图控制器上查看deinit来进行调试,但是没有一个被释放。另外,我可以在xcode Debug View Hierarchy中看到LoginVC下的第5个视图控制器。
因为没有从内存中删除它们,所以我面临的实际问题是在显示LoginVC之后,我有一个背景色alpha较小的视图控制器。因此,我看到了其下方的RegisterVC 5th视图控制器。
任何对此的帮助表示赞赏...
我认为 rootViewController 设置不是问题。也许您在其他视图控制器中有一个保留周期,可以阻止它们被释放。
有很多方法可能会意外地执行此操作(在块中捕获对 self 的强引用,而不是将委托或其他反向引用标记为弱引用等)。
你也许可以用 Instruments 来解决这个问题。这是一个教程:http : //samwize.com/2016/05/30/finding-retain-cycle-with-instruments/
| 归档时间: |
|
| 查看次数: |
3798 次 |
| 最近记录: |