zoukankan      html  css  js  c++  java
  • iOS

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

     
  • 相关阅读:
    jquery blockUI 扩展插件 Dialog
    ExtJS Form扩展组件[ColorFiled, DateTimeFiled, IconCombo, MultiComboBox, DynamicTreeCombox]
    Struts 笔记
    Spring整合CXF,发布RSETful 风格WebService
    Mybatis传递参数到 xml
    学习Mybatis xml 常用关键语法 Ivin
    一行命令搞定/usr/bin/perl^M: bad interpreter
    js基本功能大全
    Foxmail Server 可以搭建出功能强大的邮件服务器
    Access转成Sql 2008步骤,同时解决自动编号问题,主键,id数值不重置。
  • 原文地址:https://www.cnblogs.com/junhuawang/p/8528403.html
Copyright © 2011-2022 走看看