美文网首页bugiOS知识点程序员
ios开发之切换RootViewController时注意的内存

ios开发之切换RootViewController时注意的内存

作者: 谁先注册了阿K | 来源:发表于2017-02-02 18:47 被阅读4467次

1.iOS在切换根控制器时,如何销毁之前的控制器?

首先、在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

相关文章

网友评论

  • Misscxuan:看了一下demo 运行时的内存分布图, 所有的控制器都在, 这难道不算内存泄露么.
  • 7b3e85c5ac3e:错别字一大堆,但还是帮到忙了,谢啦
  • CoderHG:大神, 出BUG了, 当切换了更控制器的时候, 图层错误了.要是解决了, 记得分享一下, 谢谢~:stuck_out_tongue_winking_eye:
    CoderHG:我的锅, 没有看代码.正确的方式被你注释了, 抱歉~:+1:
  • 雨影:不知道切换rootviewcontroller怎么来的内存泄漏呢
    谁先注册了阿K:@雨影这个就是你自己的功能需求了,你可以进行验证一下
    雨影:@谁先注册了阿K 我感觉是图片加载到内存的缓存导致的。
    谁先注册了阿K:@雨影 主要是监听原来的根控制器是否被销毁。并无其他
  • 雨影:我用标志判断第一次安装,如果是第一次安装就把rootViewcontroller设置为引导页,引导页结束,讲rootviewcontroller切换到home页面,发现,内存一直不减小.因为不加载引导页,内存只有11M,而加载了引导页,再切换rootVC之后,一直保持30M不减小.引导页的delloc方法已经执行了,不知道为什么
  • Amuxiaomu:如果是tabbar需要怎么销毁..
    Amuxiaomu:@谁先注册了阿K ,就是 我直接发送通知 在appDelegate中 重新设window 的root
    谁先注册了阿K:@Amuxiaomu ,不是很清楚你的问题,不好意思。可以详细一点吗

本文标题:ios开发之切换RootViewController时注意的内存

本文链接:https://www.haomeiwen.com/subject/myaeettx.html