ios开发之切换RootViewController
写在开头
最近做需求开发,在登陆请求返回后需要填写一些基本信息,然后再显示主页面
显示登录界面时创建了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相关推荐
- IOS开发中UIBarButtonItem上按钮切换或隐藏实现案例
IOS开发中UIBarButtonItem上按钮切换或隐藏案例实现案例是本文要介绍的内容,这个代码例子的背景是:导航条右侧有个 edit button,左侧是 back button 和 add bu ...
- iOS开发 剖析网易新闻标签栏视图切换(addChildViewController属性介绍)
iOS开发 剖析网易新闻标签栏视图切换(addChildViewController属性介绍) 本来仅仅是打算介绍一下addChildViewController这种方法的,正好今天朋友去换工作面试问 ...
- Xamarin开发IOS笔记:切换输入法时输入框被遮住
在进行IOS开发的过程中,出现类似微信朋友圈的交互界面,当用户遇到感兴趣的内容可以进行评论.为了方便评论输入,当出现评论输入框的时候自动将评论输入框移动至键盘的上方,这样方便边输入边查看. 当用户隐藏 ...
- iOS开发夜间模式的设置(主题切换)
iOS开发夜间模式的设置(主题切换) 很长一段时间没有写博客了.想到自己最近刚好做了不少重构,刚好可以总结一下. 夜间模式,很多阅读类的或资讯类的App都会这个功能.以前自己也做过,现在把它抽出来封装 ...
- iOS开发UI篇—多控制器和导航控制器简单介绍
iOS开发UI篇-多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...
- iOS开发系列--通知与消息机制
http://www.cocoachina.com/ios/20150318/11364.html 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣 ...
- iOS开发UI篇—UITabBarController简单介绍
iOS开发UI篇-UITabBarController简单介绍 一.简单介绍 UITabBarController和UINavigationController类似,UITabBarControlle ...
- IOS开发系列--IOS程序开发概览
IOS开发系列--IOS程序开发概览 2014-08-04 19:42 by KenshinCui, 9983 阅读, 51 评论, 收藏, 编辑 概览 终于到了真正接触IOS应用程序的时刻了,之前我 ...
- iOS开发UI篇—Modal简单介绍
iOS开发UI篇-Modal简单介绍 一.简单介绍 除了push之外,还有另外一种控制器的切换方式,那就是Modal 任何控制器都能通过Modal的形式展⽰出来 Modal的默认效果:新控制器从屏幕的 ...
- iOS开发UINavigation系列四——导航控制器UINavigationController
iOS开发UINavigation系列四--导航控制器UINavigationController 一.引言 在前面的博客中,我么你介绍了UINavigationBar,UINavigationIte ...
最新文章
- Python3中的成员保护和访问限制
- Windows 多种版介绍
- Web常见约定规范(精选)
- windows下python依赖包_windows下安装python拓展包
- 机器学习笔试题精选(七)
- linux刚重启就报资源不可用,linux系统重启网络配置
- 微软Kubernetes服务AKS开发正式版空间服务
- 网络互连与互联网知识点笔记(五)---路由器技术
- Source InSight context 窗口丢失的解决办法
- 安全公司本意告警用户,不料先遭攻击并泄露超50亿个人数据
- Robocode教程3——Robo机器剖析
- 酒店管理系统-可行性研究报告
- 使用Postman工具进行简单的Get/Post测试
- uni-app开发APP上架应用市场遇到的坑
- 树莓派初始用户名和密码
- waf指纹识别工具WAFW00F的使用
- React Hook之Effect Hook
- Matlab中创建和使用表
- [CCFwithAxin]201709-2公共钥匙盒
- RAM/ROM存储器的设计
热门文章
- K8S异常 sonar status is ‘PENDING’
- 计算机连接网络是飞行模式怎么办,电脑wifi界面只有飞行模式怎么办
- mysql配置文件中bind_bind配置语法详解 | 羽飞博客
- html怎么设置文字竖排,CSS文字竖排
- html字数统计,html中利用javascript实现文本框字数的动态计算
- 力扣36.有效的数独
- win+ubuntu双系统卸载ubuntu
- 自己搭建的网站显示403
- 四个步骤告诉你如何进行渠道效果监测
- poi导出excel时设置单元格为数字类型(解决:导出Excel时为文本类型选中一整列不能求和问题)