写在开头

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

显示登录界面时创建了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,其中动画效果暂时关闭

- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^ __nullable)(void))completion NS_AVAILABLE_IOS(5_0);
例如:ViewController push ----> firstVC1 present ----> firstVC2 。则如何在firstVC2中切换根控制器,并同时销毁之前的控制器。则必须先dismiss掉 firstVC2 。
[self dismissViewControllerAnimated:NO completion:^{UIApplication.shared.keyWindow.rootViewController = newRootVC
}];

分析:如果不dismiss掉 firstVC2,则firstVC2不会被释放。firstVC2无法释放,必然导致firstVC1无法释放,而栈顶元素无法被释放,栈顶下面的控制器都无法释放。

注:

1、dismiss动画状态必须关闭,根控制器的切换与dismisse的动画同时进行会给用户带来较差的体验效果。

2、在项目开发中,只要有present出来的控制器,一定要有对应的dismiss,否则项目中会存在无法估量的bug(会不会有例外呢?)

发现一个例外

下面是我们工程中自己封装的方法

+ (void)showModalNavigationController:(UIViewController *)viewController animated:(BOOL)animated
{NSAssert([[NSThread currentThread] isEqual:[NSThread mainThread]], @"PUSH can only be started from the main thread.");[[AudioManager sharedInstance] stopPlayAndClearPlayList];RootNavViewController *nav = [[RootNavViewController alloc] initWithRootViewController:viewController];[AppNavigator showModalViewController:nav animated:animated];
}+ (void)showModalViewController:(UIViewController *)viewController animated:(BOOL)animated
{NSAssert([[NSThread currentThread] isEqual:[NSThread mainThread]], @"PUSH can only be started from the main thread.");if ([AppNavigator navigator].mainNav != nil) {if ([[AppNavigator navigator].mainNav presentedViewController]) {UIViewController *presentCon = [[AppNavigator navigator].mainNav presentedViewController];while (1) {UIViewController *presentConTmp = [presentCon presentedViewController];if (presentConTmp && [presentConTmp isKindOfClass:[UINavigationController class]]) {presentCon = presentConTmp;}else{break;}}[presentCon presentViewController:viewController animated:animated completion:nil];} else {[[AppNavigator navigator].mainNav presentViewController:viewController animated:animated completion:nil];}}
}

偶然间发现一个事情,当使用如下方法:

+ (void)showModalNavigationController:(UIViewController *)viewController animated:(BOOL)animated

在Present出一个Controller之前,我们先创建了一个RootNavViewController。然后在页面返回时,可以试一下popViewController,会有神奇的效果!

参考文献:https://www.jianshu.com/p/ac4aebdc74d4

ios开发之切换RootViewController相关推荐

  1. IOS开发中UIBarButtonItem上按钮切换或隐藏实现案例

    IOS开发中UIBarButtonItem上按钮切换或隐藏案例实现案例是本文要介绍的内容,这个代码例子的背景是:导航条右侧有个 edit button,左侧是 back button 和 add bu ...

  2. iOS开发 剖析网易新闻标签栏视图切换(addChildViewController属性介绍)

    iOS开发 剖析网易新闻标签栏视图切换(addChildViewController属性介绍) 本来仅仅是打算介绍一下addChildViewController这种方法的,正好今天朋友去换工作面试问 ...

  3. Xamarin开发IOS笔记:切换输入法时输入框被遮住

    在进行IOS开发的过程中,出现类似微信朋友圈的交互界面,当用户遇到感兴趣的内容可以进行评论.为了方便评论输入,当出现评论输入框的时候自动将评论输入框移动至键盘的上方,这样方便边输入边查看. 当用户隐藏 ...

  4. iOS开发夜间模式的设置(主题切换)

    iOS开发夜间模式的设置(主题切换) 很长一段时间没有写博客了.想到自己最近刚好做了不少重构,刚好可以总结一下. 夜间模式,很多阅读类的或资讯类的App都会这个功能.以前自己也做过,现在把它抽出来封装 ...

  5. iOS开发UI篇—多控制器和导航控制器简单介绍

    iOS开发UI篇-多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...

  6. iOS开发系列--通知与消息机制

    http://www.cocoachina.com/ios/20150318/11364.html 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣 ...

  7. iOS开发UI篇—UITabBarController简单介绍

    iOS开发UI篇-UITabBarController简单介绍 一.简单介绍 UITabBarController和UINavigationController类似,UITabBarControlle ...

  8. IOS开发系列--IOS程序开发概览

    IOS开发系列--IOS程序开发概览 2014-08-04 19:42 by KenshinCui, 9983 阅读, 51 评论, 收藏, 编辑 概览 终于到了真正接触IOS应用程序的时刻了,之前我 ...

  9. iOS开发UI篇—Modal简单介绍

    iOS开发UI篇-Modal简单介绍 一.简单介绍 除了push之外,还有另外一种控制器的切换方式,那就是Modal 任何控制器都能通过Modal的形式展⽰出来 Modal的默认效果:新控制器从屏幕的 ...

  10. iOS开发UINavigation系列四——导航控制器UINavigationController

    iOS开发UINavigation系列四--导航控制器UINavigationController 一.引言 在前面的博客中,我么你介绍了UINavigationBar,UINavigationIte ...

最新文章

  1. Python3中的成员保护和访问限制
  2. Windows 多种版介绍
  3. Web常见约定规范(精选)
  4. windows下python依赖包_windows下安装python拓展包
  5. 机器学习笔试题精选(七)
  6. linux刚重启就报资源不可用,linux系统重启网络配置
  7. 微软Kubernetes服务AKS开发正式版空间服务
  8. 网络互连与互联网知识点笔记(五)---路由器技术
  9. Source InSight context 窗口丢失的解决办法
  10. 安全公司本意告警用户,不料先遭攻击并泄露超50亿个人数据
  11. Robocode教程3——Robo机器剖析
  12. 酒店管理系统-可行性研究报告
  13. 使用Postman工具进行简单的Get/Post测试
  14. uni-app开发APP上架应用市场遇到的坑
  15. 树莓派初始用户名和密码
  16. waf指纹识别工具WAFW00F的使用
  17. React Hook之Effect Hook
  18. Matlab中创建和使用表
  19. [CCFwithAxin]201709-2公共钥匙盒
  20. RAM/ROM存储器的设计

热门文章

  1. K8S异常 sonar status is ‘PENDING’
  2. 计算机连接网络是飞行模式怎么办,电脑wifi界面只有飞行模式怎么办
  3. mysql配置文件中bind_bind配置语法详解 | 羽飞博客
  4. html怎么设置文字竖排,CSS文字竖排
  5. html字数统计,html中利用javascript实现文本框字数的动态计算
  6. 力扣36.有效的数独
  7. win+ubuntu双系统卸载ubuntu
  8. 自己搭建的网站显示403
  9. 四个步骤告诉你如何进行渠道效果监测
  10. poi导出excel时设置单元格为数字类型(解决:导出Excel时为文本类型选中一整列不能求和问题)