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

Flutter Engine 随机崩溃(EXC_BAD_ACCESS)问题排查求助

问题分析与解决

核心问题

你的代码存在重复创建同名FlutterEngine的致命问题:

  1. AppDelegate启动时已初始化并运行了名为my flutter engine的全局引擎
  2. HomeVC中又手动销毁原有引用、重新创建同名引擎并启动,这会触发Flutter内部资源冲突,直接导致内存访问错误(EXC_BAD_ACCESS)

修复步骤

1. 复用全局引擎实例

删除HomeVC里重新创建引擎的代码,直接复用AppDelegate中已初始化好的引擎:

// HomeVC.m 修改后代码
FlutterEngine *flutterEngine = ((IKAppDelegate *)UIApplication.sharedApplication.delegate).flutterEngine;

// 仅在全局引擎未初始化的极端情况才创建(可选)
if (flutterEngine == nil) {
    flutterEngine = [[FlutterEngine alloc] initWithName:@"my flutter engine"];
    [flutterEngine run];
    [GeneratedPluginRegistrant registerWithRegistry:flutterEngine];
    // 将新引擎赋值回AppDelegate,保证全局唯一
    ((IKAppDelegate *)UIApplication.sharedApplication.delegate).flutterEngine = flutterEngine;
}

// 直接用全局引擎创建FlutterViewController
FlutterViewController *flutterViewController = [[FlutterViewController alloc] initWithEngine:flutterEngine nibName:nil bundle:nil];
FlutterMethodChannel* moduleChannel = [FlutterMethodChannel
                                       methodChannelWithName:@"com.ikea.kompis/nativeToFlutter"
                                       binaryMessenger:flutterViewController.binaryMessenger];
[moduleChannel invokeMethod:@"nativeToFlutter"
                  arguments:jsonString];
flutterViewController.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentViewController:flutterViewController animated:YES completion:nil];

2. 移除重复的插件注册操作

AppDelegate中已经执行过[GeneratedPluginRegistrant registerWithRegistry:self.flutterEngine],HomeVC里不要再重复调用,否则会引发插件多次注册的内存问题。

3. 清理危险的内存操作

删除HomeVC中flutterEngine = nil的手动置空代码,这会破坏全局引擎的引用链,导致不可控的内存释放。

额外优化建议

  • 封装全局FlutterEngine管理类,统一处理引擎的初始化、获取和销毁逻辑,避免多处操作导致的状态不一致
  • 若需多引擎场景,必须使用不同的引擎名称,禁止重复使用同一名称创建引擎

内容的提问来源于stack exchange,提问作者seena seena

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 05:50:34