美文网首页iOS开发记录iOS学习专题iOS基本功
iOS开发切换根控制器,老控制器和子视图释放不了

iOS开发切换根控制器,老控制器和子视图释放不了

作者: 夜凉听风雨 | 来源:发表于2019-02-25 18:29 被阅读11次

    最近在项目中发现了一个控制器和子视图释放不掉的问题。写此文记录一下,希望能帮到遇到和我一样问题的人。

    附上demo下载地址:https://github.com/jiangbin1993/DeallocDemo.git

    问题一:在切换根控制器的时候,老的根控制器并没有释放掉。

    原因:在切换根控制器之前在根控制器上做了modal操作
    LoginViewController *vc = [[LoginViewController alloc] init];
        UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
        [[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:nav animated:YES completion:nil];
    
    解决方法:

    在切换根控制器之前先dismiss这些控制器

    AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
        // 必须先把根控制器modal出来的控制器dismiss掉再重设根控制器 不然之前的根控制器会释放不掉
        [delegate.window.rootViewController dismissViewControllerAnimated:NO completion:nil];
        delegate.window.rootViewController = nil;
        JJTabbarViewController *vc = [[JJTabbarViewController alloc] init];
        UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
        delegate.window.rootViewController = nav;
    

    问题二:老控制器释放了,但是老控制器的子视图没有释放

    原因一:子视图里面的定时器没有销毁
    解决方法: 在控制器的dealloc方法里销毁掉子视图的定时器
    原因二: 这个项目的控制器结构是appdelegate.window的根控制器是一个UINavigationController ,这个导航控制器的根视图是UITabbarController。tabbar控制器下是几个子控制器。在切换根控制器时会导致tabbar控制器当前正在显示的子控制器的子视图无法释放。
    项目结构图.png
    解决方法: 在tabbar控制器所有的子控制器dealloc方法里移除掉所有的子视图。

    在demo中一开始不移除子视图,在首页弹出登陆控制器,然后切换根控制器,发现所有的控制器和首页控制器之外的子视图都释放了,唯独首页控制器的子视图并没有释放。

    控制台打印 :

    2019-02-25 18:10:23.588 TabbarDeallocDemo[96176:723960] tabbar控制器销毁了
    2019-02-25 18:10:23.588 TabbarDeallocDemo[96176:723960] 首页控制器销毁
    2019-02-25 18:10:23.588 TabbarDeallocDemo[96176:723960] 我的控制器销毁
    2019-02-25 18:10:23.589 TabbarDeallocDemo[96176:723960] 我的contentview销毁

    然后在子控制器的dealloc方法中移除所有子视图重新运行,执行相同操作。这时所有的控制器和子视图都释放了。

    - (void)dealloc {
        for (id view in self.view.subviews) {
            [view removeFromSuperview];
        }
    }
    

    控制台打印:
    2019-02-25 18:02:35.175 TabbarDeallocDemo[96145:720401] tabbar控制器销毁了
    2019-02-25 18:02:35.175 TabbarDeallocDemo[96145:720401] 我的控制器销毁
    2019-02-25 18:02:35.176 TabbarDeallocDemo[96145:720401] 我的contentview销毁
    2019-02-25 18:02:35.176 TabbarDeallocDemo[96145:720401] 首页控制器销毁
    2019-02-25 18:02:35.176 TabbarDeallocDemo[96145:720401] 首页contentview销毁

    相关文章

      网友评论

        本文标题:iOS开发切换根控制器,老控制器和子视图释放不了

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