使用presentModalViewController循环模态展示VC致应用卡死求助
问题描述
启动App时实例化了VC1、VC2、VC3三个视图控制器,想要通过模态方式循环展示:VC1→VC2→VC3→VC1。每个VC通过[self presentModalViewController:nextViewController animated:TRUE]跳转下一个VC,但从VC3跳转到VC1时,App直接卡死无响应,Xcode显示CPU占用从0%飙升至99%,内存从20MB涨到1GB,无法通过调试器暂停,只能终止进程,控制台无报错信息。用Storyboard的segues实现相同流程可正常运行,核心代码如下:
#import "VC2.h" @implementation VC2 - (IBAction)onNextButtonClicked:(id)sender { [self presentModalViewController:_nextViewController animated:TRUE]; } @end
问题原因与解决方案
- 模态视图层级闭环触发死循环:iOS的模态呈现机制中,VC1是VC2的presentingViewController,VC2又是VC3的presentingViewController,当VC3尝试present已存在的VC1时,三者形成了闭环的层级引用。系统在调整模态栈时会陷入无限循环,不断重复处理视图层级逻辑,最终导致CPU和资源耗尽。
- Storyboard Segues的逻辑差异:Segues跳转时默认会创建新的VC实例(除非手动复用),不会复用已存在的VC对象,因此不会形成闭环的层级依赖,自然不会触发死循环。
- 修复方案:
- 放弃复用已实例化的VC,每次跳转时创建新的目标VC实例:
- (IBAction)onNextButtonClicked:(id)sender { VC1 *vc1 = [[VC1 alloc] initWithNibName:@"VC1" bundle:nil]; [self presentModalViewController:vc1 animated:TRUE]; } - 若需复用VC实例,采用先dismiss到根再present的方式:从VC3依次dismiss回到VC1,再重新present VC2,打破闭环层级;或改用导航控制器的push/pop逻辑实现循环跳转。
- 放弃复用已实例化的VC,每次跳转时创建新的目标VC实例:
内容的提问来源于stack exchange,提问作者wonder-mike
相关产品推荐
相关产品推荐

