Menu

  • 博客
  • 关于唯我&博客
  • 唯我DIY
  • 讨论区

Copyright © VIIIO.COM | Theme by Theme in Progress | 基于 WordPress

千里之行,始于足下唯我 - 梦想从此起航

OC UIWindow setRootViewController切换界面引发的内存问题

2018年12月5日iOS Standard
Views: 5,409

[转载请注明出处]

相信很多人都有这样的需求,直接从UIWindow层面切换主界面,如引导界面 -> 登录界面, 登录界面 -> Home,
以引导->登录 为例,一般人都会查到两种方案:
1、KeyWindow在下层,引导页新建Window,覆盖在KeyWindow之上;
2、KeyWindow直接做引导,引导完成后通过setRootViewController更换为登录界面。

第一种方案是比较理想的,但也不是没有坑,不够熟悉的话也可能释放不掉,而且需要上下两个window同时加载。此方案暂不在本文讨论之列。

第二种容易出现内存问题,主要原因大部分是因为在rootViewController上进行了presentViewController。

直接先上解决方案:

UIViewController *rootVc = [UIApplication sharedApplication].delegate.window.rootViewController;
[[UIApplication sharedApplication].delegate.window setRootViewController:newRootVc];
for (UIView *subView in rootVc.view.subviews)
    [subView removeFromSuperview];
[rootVc dismissViewControllerAnimated:NO completion:nil];

 

解析:

下列语句可保证present的ViewController被释放:

[rootVc dismissViewControllerAnimated:NO completion:nil];

下列语句保证rootVc资源释放:

for (UIView *subView in rootVc.view.subviews)
    [subView removeFromSuperview];

最后附上带动画切换的完整方案:

 

__weak UIViewController *weakRoot = [UIApplication sharedApplication].delegate.window.rootViewController;
    Animation animation = ^{
        BOOL oldState = [UIView areAnimationsEnabled];
        [UIView setAnimationsEnabled:NO];
        [[UIApplication sharedApplication].delegate.window setRootViewController:newRootVc];
        [UIView setAnimationsEnabled:oldState];
    };
    [UIView transitionWithView:[UIApplication sharedApplication].delegate.window
                      duration:0.5f
                       options:UIViewAnimationOptionTransitionCrossDissolve | UIViewAnimationOptionPreferredFramesPerSecond60
                    animations:animation
                    completion:nil];
    
    //释放rootVc中的资源,否则可能出现内存泄露
    for (UIView *subView in weakRoot.view.subviews)
        [subView removeFromSuperview];
    [weakRoot dismissViewControllerAnimated:NO completion:nil];

发表评论或回复 取消回复

邮箱地址不会被公开。

78 − = 68

近期文章

  • OC UIWindow setRootViewController切换界面引发的内存问题
  • iOS证书、AppId、PP文件之间的关系
  • SVN服务器搭建、备份及多服务器同步方案(Windows)
  • [转]iOS多线程-各种线程锁的简单介绍
  • Mac 下Apache2 配置多虚拟主机

近期评论

  • NARYTHY288954NEYRTHYT发表在《ASP.NET整合Discuz PHP站 并实现用户同步》
  • nym402059flebno发表在《ASP.NET整合Discuz PHP站 并实现用户同步》
  • nem2182758krya发表在《ASP.NET整合Discuz PHP站 并实现用户同步》
  • aresgrb.se发表在《ASP.NET整合Discuz PHP站 并实现用户同步》
  • Vincenturbam发表在《ASP.NET整合Discuz PHP站 并实现用户同步》

分类目录

  • ASP.NET (15)
  • Git (2)
  • HTML (1)
  • iOS (31)
  • Javascript (7)
  • Oracle (8)
  • SQL (3)
  • SQLSERVER (2)
  • SVN (1)
  • 一行代码系列 (5)
  • 微信小程序 (1)
  • 正则表达式 (2)
  • 网站建设 (5)

文章归档

  • 2018年12月 (1)
  • 2018年4月 (1)
  • 2017年12月 (2)
  • 2017年7月 (3)
  • 2017年6月 (1)
  • 2017年4月 (1)
  • 2017年1月 (1)
  • 2016年12月 (3)
  • 2016年10月 (1)
  • 2016年7月 (1)
  • 2016年6月 (1)
  • 2016年5月 (3)
  • 2016年4月 (5)
  • 2016年3月 (4)
  • 2016年2月 (2)
  • 2016年1月 (3)
  • 2015年12月 (11)
  • 2015年11月 (7)
  • 2015年10月 (3)
  • 2015年9月 (1)
  • 2015年8月 (1)
  • 2015年7月 (1)
  • 2015年6月 (1)
  • 2015年5月 (1)
  • 2015年4月 (1)
  • 2014年7月 (1)
  • 2014年6月 (1)
  • 2014年5月 (2)
  • 2014年4月 (2)
  • 2014年3月 (2)
  • 2014年2月 (2)
2025年5月
一 二 三 四 五 六 日
« 12月    
 1234
567891011
12131415161718
19202122232425
262728293031