一.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

ios 销毁当前页面重新开启_iOS - 切换rootViewController时,销毁之前的控制器相关推荐

  1. ios 销毁当前页面重新开启_利用Vue中keep-alive,快速实现页面缓存

    keep-alive 有时候我们不希望组件被重新渲染影响使用体验:或者处于性能考虑,避免多次重复渲染降低性能.而是希望组件可以缓存下来,维持当前的状态.这时候就可以用到keep-alive组件. 官网 ...

  2. 记录vue中component切换组件时销毁定时器问题

    问题描述:有A.B两个子组件,通过component进行切换,子组件中有定时器,当切换组件时需要把定时器给注销掉. 1.通过VUE组件生命周期进行删除定时器 2.使用this.$once来监听定时器 ...

  3. ios 销毁当前页面重新开启_问:如何强制销毁iOS中的视图控制器?

    是否可以在iOS中回收/强制销毁UIViewController?问:如何强制销毁iOS中的视图控制器? 我用这github project得到一个定制UIViewControllerTransiti ...

  4. ios沙箱模式开启_iOS的沙箱机制 是否应该清理后台

    在这里不讨论iOS的封闭性,这些是手机厂商.应用程序开发者需要深入了解的,下面讨论的是iOS的沙箱机制,来了解它对我们个人用户所产生影响 什么是沙箱机制? ​ 每个APP都有自己的独立存储空间,安装的 ...

  5. 微信公众号调取jssdk扫一扫功能,ios第一次进入页面调取失败(需刷新页面才能调取成功,Android正常)的解决方法

    注意:ios第一次进入页面调取失败的原因主要在于传入的path路径 const data = { url:encodeURIComponent(location.href.split('#')[0]) ...

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

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

  7. jsp页面div上下滑动_H5单页面手势滑屏切换原理

    H5单页面手势滑屏切换是采用HTML5 触摸事件(Touch) 和 CSS3动画(Transform,Transition)来实现的,效果图如下所示,本文简单说一下其实现原理和主要思路. 实现原理 假 ...

  8. html5页面的手势,HTML5单页面手势滑屏切换如何实现

    这次给大家带来HTML5单页面手势滑屏切换如何实现,怎么实现HTML5单页面手势滑屏切换?HTML5单页面手势滑屏切换的注意事项有哪些,下面就是实战案例,一起来看一下. H5单页面手势滑屏切换是采用H ...

  9. 苹果微信html页面缓存,Ios中微信页面返回上一页去除缓存几种常见思路

    前言 这篇文章主要讲解决思路,不对各种概念进行过多讲解. 问题描述 开发微信H5页面的时候,在Ios微信内置浏览器中点击返回按钮返回上一页时,上一页面不会被刷新. 在浏览器缓存机制中,在返回上一页的操 ...

  10. html ios返回后刷新页面,Ios中微信页面返回上一页去除缓存几种常见思路

    前言 这篇文章和第,.年过事工宗据指数遍互业经搞断果会主要讲解决思路,不对各种概念进行抖要支圈者器说是事天开的.年后编定功口小发还应久剑过多讲解. 问题描述 开发微信H5页面的时候,在Ios微信内置浏 ...

最新文章

  1. 万字长文详解如何用Python玩转OpenGL | CSDN 博文精选
  2. 无需标注数据集,自监督注意力机制就能搞定目标跟踪
  3. Keras方法进行词嵌入
  4. C++ 函数模板特化导致的多重定义链接错误
  5. 作者:孔新川,杭州迈宁数据科技有限公司创始人、CEO。
  6. 6-10 阶乘计算升级版(20 分)
  7. oracle数据库11g完全卸载,oracle 11g完全卸载
  8. SPOJ COT2 (树上莫队)
  9. 使用 ODP.NET 访问 Oracle(.net如何访问Oracle)详解
  10. 对象行为型 - Observer观察者模式
  11. vue实时获取当前时间
  12. hash函数(哈希表)
  13. Python内存优化,节省内存字典ConstDict
  14. Android大话设计模式 第一章----针对接口编程---问世间情为何物 直教人生死相许
  15. iOS开发之定位神器-超简单方式解决iOS后台定时定位
  16. Uncaught RangeError Maximum call stack size exceeded
  17. NameError: name 'mnist' is not defined
  18. D3.js SVG绘图实践:波浪动画
  19. SQL Server 数据库之收缩数据库和文件
  20. (VUE)纯前端实现图片生成并打包成zip下载

热门文章

  1. 路由器配置双宽带,并相互备份使用
  2. 程序员,从培训班出来的都是垃圾!!!?
  3. 一元三次方程c语言程序,一元三次方程求解
  4. mac使用vscode
  5. 使用MediaRecorder录制音频和视频(Camera1)
  6. 【整理】【原创】 什么是一维表,什么是二维表?----不同于 1维数组,2维数组
  7. 神经网络的相关函数以及误差类型
  8. 手撸Mybatis源码-基础版
  9. advanced option里面没有resolution
  10. 域名带www和不带的区别