一.iOS在切换根控制器时,如何销毁之前的控制器?(切换rootViewController时注意的内存泄漏)

首先、在iOS的ARC机制下,任何对象,当没有其他对象对他进行强引用时,都会被自动释放。

而控制器的切换主要为两种方式 push和present modally。


1.0 push出来的子控制器,导航栏控制器会对该子控制器进行强引用(本质就是入栈,在入栈的过程中,可能不止是导航栏控制器对子控制器有强引用)

其中 push 对应着 pop 则控制器会被销毁。其push的本质是入栈,所有的子控制器放在数组中,先进后出,如果导航栏作为根控制器。此时需要更该根控制器,不管push了多少子控制器入栈了。其最后只需要在当前显示的子控制器中对根控制器重新赋值即可。即原先的导航栏控制器没有对象强引用它,它会被释放,其所有的子控制器自然都会被释放了(前提是你本身代码不存在其他内存泄漏)

UIApplication.shared.keyWindow?.rootViewController = newRootVC

1.1 谁来调用这消失presented VC的这个方法:正确的做法是“谁污染谁治理”,对于弹出模态,系统指定了销毁的方法dismiss,其中动画效果暂时关闭(原因在后面)

dismiss(animated: false, completion: nil)

举例: 在我们的项目中假如需要在firstVC2控制器进行根控制器的切换。firstVC2控制器是这样来的:

ViewController  push ---->firstVC1  present--->firstVC2 。则如何在firstVC2中切换根控制器,并同时销毁之前的控制器。则必须先dismiss掉 firstVC2 。实现如下:

dismiss(animated: false) {

UIApplication.shared.keyWindow?.rootViewController = newRootVC

}

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

注意:

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

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

demo的代码:https://github.com/ZuoCaiSong/TestRootVC

 

iOS - 切换rootViewController时,销毁之前的控制器的更多相关文章

  1. iOS:切换视图时,反向传递数据方法一:通知

    通知方式: 1.有一个(单例)通知中心,负责管理iOS中的所有通知 2.需要获取某种通知,必须注册成为观察者(订阅) 3.不再需要取某种通知时,要取消注册. 4.你可以向通知中心发送某种通知,通知中心 ...

  2. iOS 切换首页-更改tabbar的容器控制器

    最近想到的一个小需求: 首页切换:点击一个切换按钮,能实现首页的风格.排版等变换,原理是用一个新的VC替换掉. 效果如下:   ====>====> 实现方式很简单: 以我的Demo为例, ...

  3. iOS:切换视图时,反向传递数据方法二:代理

    代理: 1.发送信息的控制器设置一个代理,并自定义一个代理的方法,用来传递数据 2.接受信息的控制器遵循发送信息的控制器的协议 3.接受信息的控制器设置发送信息的控制器的代理为自己self 4.接受信 ...

  4. iOS切换window根控制器 (转)

    转自linfengwenyou 在运行过程中更改根控制器的方法:(假设:A为当前根控制器,B为要设的根控制器) 方法一: 1. appdelegate.m中 self.window = [[UIWin ...

  5. ios 仿新浪微博 UINavigationController 向左滑动时显示上一个控制器的View.

    仿新浪微博 UINavigationController 向左滑动时显示上一个控制器的View. 实现原理,UINavigationController 的 self.view显示时把当前显示的vie ...

  6. iOS 单例的销毁

    今天做项目的时候,对于不同的用户,需要创建不同的数据库.但是退出登录切换账号时,因为用单例创建数据,导致切换账号不会切换数据.所以,需要销毁单例.销毁单例时,调用以下的代码: 在创建单例的那个类中,调 ...

  7. (转载)解决切换Fragment时布局重新实例化

    解决切换Fragment时布局重新实例化 作者 instanceof 关注 2015.12.30 17:25* 字数 628 阅读 7616评论 17喜欢 23 关于Fragment 在这简单说一下F ...

  8. 使用ViewPager切换Fragment时,防止频繁调用OnCreatView

    使用ViewPager切换Fragment,我原先使用系统自带的适配器FragmentPagerAdapter. 切换fragment时,频繁调用oncreatview(). 查看FragmentPa ...

  9. iOS打包导出时出现Missing iOS Distribution signing

    iOS打包导出时出现Missing iOS Distribution signing 上传APP就出现Missing iOS Distribution signing indetity for 打包i ...

随机推荐

  1. C#并行Parallel编程模型实战技巧手册

    一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和 ...

  2. 修正 Mui 下拉上拉刷新功能

    下拉增加动态时间计算功能: 上拉增加状态文字提示功能(当然也支持时间计算功能,只是我们暂时用不到):

  3. 构建第一个 Spring Boot 工程

    Spring Boot概述 什么是Spring Boot 随着动态语言的流行,java的开发显得格外笨重,繁多的配置文件编写,低下的开发效率,复杂的部署流程以及第三方技术集成难度大. 在上述环境下Sp ...

  4. [转载]震惊!QWidget竟然可以嵌入到QML中,QMl窗口句柄竟然是这样获取

      背景 记得在初学qml时,就被大佬告知Qml的实现有两种方式“view+item”和“engine+widow”,那么能不能将QWidget嵌入到QML中来呢,我收到的答案是不可以,原因是QML的 ...

  5. SQL2012 之 创建备份计划

    打开数据库,选择 管理 → 右键维护计划→选择新建维护计划,填写计划名称,如下图: 修改维护计划参数,如下图: 工具箱->备份数据库任务,拖到计划里,如下图: 编辑“备份数据库”任务,如下图: ...

  6. eclipse Mars查看JDK源代码

    eclipse Mars查看JDK源代码 问题描写叙述,eclipse(mars)下看不到JDK类的声明即源代码部分的内容. 如图右击string类型: 点击打开声明.结果出现了下图所看到的的错误,无 ...

  7. Spring MVC实现上传文件报错解决方案

    报错代码: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.sp ...

  8. WEB前端工程师的职业发展路线图、怎样做WEB前端职业规划

    20151028整理 —————————— 知乎-Web前端的路该怎么走?(2015年发表) 在规模越大的团队,工作划分得越细腻,专注的点就越深,但同时就可能会被限制在某个狭窄点上,成为某个角落的技术 ...

  9. Effective Java 第三版——5. 使用依赖注入取代硬连接资源

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  10. texlive测试是否安装成功

    在完成TEX Live安装之后,自然你会希望试试看它是否正常工作,好让你在以后能够创建优美的文档和字体. 1.首先确认你可以执行tex程序: >tex --version TeX 3.14159 ...