写在开头
最近做需求开发,在登陆请求返回后需要填写一些基本信息,然后再显示主页面
显示登录界面时创建了RootViewController
显示主页面的时候,以Tabbar作为新的RootViewController
切换RootViewController以后,页面看起来没有什么问题,查看层级关系发现原来的界面并没有释放,造成了内存泄漏
1.pushViewController
push出来的子控制器,导航栏控制器会对该子控制器进行强引用,
Push 其本质就是入栈操作,在入栈的过程中,可能不止是导航栏控制器对子控制器有强引用,其中 push 对应着 pop 则控制器会被销毁。
其push的本质是入栈,所有的子控制器放在数组中,后进先出。
如果导航栏作为根控制器。此时需要更该根控制器,不管push了多少子控制器入栈,其最后只需要在当前显示的子控制器中对根控制器重新赋值即可。
即原先的导航栏控制器没有对象强引用它,它会被释放,其所有的子控制器自然都会被释放了 前提是你本身代码不存在其他内存泄漏
UIApplication.shared.keyWindow.rootViewController = newRootVC
2.presented VC(showMoalVC)
除了push出来的页面,可能还会出现present出来新的页面,这个时候如果在present页面更换RootViewC