ios开发之切换RootViewController

本文探讨了在iOS开发中切换RootViewController时如何处理push和presented ViewController,以避免内存泄漏。当使用pushViewController时,确保在更改根控制器后,导航控制器会正确释放所有子控制器。而对于presented ViewController,必须调用dismiss以防止内存泄漏。文中强调了在处理present操作时关闭动画的重要性,并提醒开发者始终要有相应的dismiss操作。文章还提及了一个工程中封装的方法,通过在Present前创建RootNavViewController并在返回时pop,可以观察到意想不到的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在开头

最近做需求开发,在登陆请求返回后需要填写一些基本信息,然后再显示主页面

显示登录界面时创建了RootViewController

显示主页面的时候,以Tabbar作为新的RootViewController

切换RootViewController以后,页面看起来没有什么问题,查看层级关系发现原来的界面并没有释放,造成了内存泄漏

1.pushViewController

push出来的子控制器,导航栏控制器会对该子控制器进行强引用,

Push 其本质就是入栈操作,在入栈的过程中,可能不止是导航栏控制器对子控制器有强引用,其中 push 对应着 pop 则控制器会被销毁。

其push的本质是入栈,所有的子控制器放在数组中,后进先出。

如果导航栏作为根控制器。此时需要更该根控制器,不管push了多少子控制器入栈,其最后只需要在当前显示的子控制器中对根控制器重新赋值即可。

即原先的导航栏控制器没有对象强引用它,它会被释放,其所有的子控制器自然都会被释放了 前提是你本身代码不存在其他内存泄漏

UIApplication.shared.keyWindow.rootViewController = newRootVC

2.presented VC(showMoalVC)

除了push出来的页面,可能还会出现present出来新的页面,这个时候如果在present页面更换RootViewController。看起来是没有问题的,实际上原来的页面还保留着,产生了内存泄漏。

那么,谁来让presented VC消失呢?正确的做法是“谁污染谁治理”。

对于弹出模态,系统指定了销毁的方法dismiss,其中动画效果暂时关闭

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值