You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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逻辑实现循环跳转。

内容的提问来源于stack exchange,提问作者wonder-mike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 17:37:05