[Bug]: iOS: 原生控制器嵌入一块FBFlutterViewContainer,当控制器返回时原生控制器走了deinit,但是FBFlutterViewContainer没有释放
请描述遇到的问题,以及您所期望的正确的结果
flutter version: 3.10.6 iOS : swift
一个原生控制器,上半部分是原生的,下半部分嵌入一块FBFlutterViewContainer,当返回时该原生控制器走了deinit,但是 FBFlutterViewContainer没有走 dealloc 。期望 FBFlutterViewContainer 能够正常释放。
请说明如何操作会遇到上述问题
No response
在下面填入关键复现代码
// // NativeViewController.swift // Runner // // Created by Apple on 2025/8/19. //
import Foundation import UIKit import flutter_boost import MCommonBiz
class NativeViewController: MCBaseViewController { var flutterContainer: FBFlutterViewContainer?
override func viewDidLoad() {
super.viewDidLoad()
self.title = "测试"
setupFlutterView()
}
private func setupFlutterView() {
// 创建 Flutter 容器
let container = FBFlutterViewContainer()
container?.setName("catalog/detail", uniqueId: nil, params: nil, opaque: true)
// 添加为子控制器
addChild(container!)
view.addSubview(container!.view)
container?.didMove(toParent: self)
container?.view.frame = CGRect(x: 0,
y: 200,
width: Screen.width,
height: Screen.height - 200)
self.flutterContainer = container
}
deinit {
flutterContainer?.detachFlutterEngineIfNeeded()
flutterContainer?.notifyWillDealloc()
flutterContainer?.removeFromParent()
flutterContainer?.view.removeFromSuperview()
flutterContainer = nil
print("✅ NativeViewController deallocated")
}
}
复现的平台
iOS
Flutter SDK版本
3.10.6
FlutterBoost版本
4.6.3
是否延迟初始化FlutterBoost
No
解决方案
解决这个问题了么兄弟,我也遇到了
解决这个问题了么兄弟,我也遇到了
没有解决,我跑的是官方demo,确实存在内存泄漏。flutter页面走了dispose,壳控制器也走了deinit,就是FBFlutterViewContainer控制器没有释放。
解决这个问题了么兄弟,我也遇到了
没有解决,我跑的是官方demo,确实存在内存泄漏。flutter页面走了dispose,壳控制器也走了deinit,就是FBFlutterViewContainer控制器没有释放。
我这边解决了,不知道是不是跟你的场景一样,你可以试下我的方法。deinit { print("\(type(of: self).description()) ----- deinit") // 如果有这个页面就释放 if YHAuthority.saleStatistics.isAuthed { newSaleStatisticsVC.detachFlutterEngineIfNeeded() newSaleStatisticsVC.notifyWillDealloc() } } 在 UITabBarController 的 deinit 里面手动释放
解决这个问题了么兄弟,我也遇到了
没有解决,我跑的是官方demo,确实存在内存泄漏。flutter页面走了dispose,壳控制器也走了deinit,就是FBFlutterViewContainer控制器没有释放。
我这边解决了,不知道是不是跟你的场景一样,你可以试下我的方法。
deinit { print("\(type(of: self).description()) ----- deinit") // 如果有这个页面就释放 if YHAuthority.saleStatistics.isAuthed { newSaleStatisticsVC.detachFlutterEngineIfNeeded() newSaleStatisticsVC.notifyWillDealloc() } }在 UITabBarController 的 deinit 里面手动释放
按说场景差不多,只不过你是将FBFlutterViewContainer添加在UITabBarController上,我是将FBFlutterViewContainer添加在UIViewController上的。同样也做了释放操作,但是FBFlutterViewContainer就是没有走 - (void)dealloc{}。真是奇怪了!!!
- (void)dealloc{ [self.flutterContainer didMoveToParentViewController:nil]; [self.flutterContainer detachFlutterEngineIfNeeded]; [self.flutterContainer notifyWillDealloc]; }