flutter_boost icon indicating copy to clipboard operation
flutter_boost copied to clipboard

[Bug]:iOS 容器内存泄露 FlutterSDK-3.10.6 FlutterBoost-4.4.0

Open BaseBBHuang opened this issue 1 year ago • 6 comments

请描述遇到的问题,以及您所期望的正确的结果

问题: 1.使用 FlutterBoost提供的 Demo 工程,在首页 Push 一个 Flutter 容器页面; 2.在 Flutter 容器页面,返回到上一级首页页面,容器 FBFlutterViewContainer 的 dealloc 没调用,内存泄露; 3.再次点击 push Flutter 容器之后,FBFlutterViewContainer 的 dealloc 才被调用; 4.再次从 FBFlutterViewContainer 返回上一级页面,dealloc 没调用,内存泄露;

期望:

  1. 容器 FBFlutterViewContainer 的 dealloc 正常调用,内存释放;

请说明如何操作会遇到上述问题

1.使用 FlutterBoost提供的 Demo 工程,在首页 Push 一个 Flutter 容器页面; 2.在 Flutter 容器页面,返回到上一级首页页面,容器 FBFlutterViewContainer 的 dealloc 没调用,内存泄露; 3.再次点击 push Flutter 容器之后,FBFlutterViewContainer 的 dealloc 才被调用; 4.再次从 FBFlutterViewContainer 返回上一级页面,dealloc 没调用,内存泄露;

在下面填入关键复现代码

  • (void)dealloc { if (self.removeEventCallback != nil) { self.removeEventCallback(); } [NSNotificationCenter.defaultCenter removeObserver:self]; _leftEdgeGesture.delegate = nil; } 以上方法,在 Flutter 容器页面退出时,没有被调用。

复现的平台

iOS

Flutter SDK版本

3.10.6

FlutterBoost版本

4.4.0

是否延迟初始化FlutterBoost

No

解决方案

1.在 3.7.0 ~ 3.7.12 的版本,在 FlutterViewController 容器页面退出时,dealloc 会调用,正常释放; 2.猜测和 impller 的引擎有关系; 3.没具体是探究,待后面有时间探究一下;

BaseBBHuang avatar Aug 15 '23 08:08 BaseBBHuang

Simulator Screenshot - iPhone 14 Pro Max - 2023-08-15 at 16 37 58 Simulator Screenshot - iPhone 14 Pro Max - 2023-08-15 at 16 39 15

BaseBBHuang avatar Aug 15 '23 08:08 BaseBBHuang

请这看看这个问题,比较严重。不敢在线上使用了

MarkTangs avatar Aug 21 '23 11:08 MarkTangs

把flutter切回去是没有泄漏,但是退出页面后内存也没有减少多少

MarkTangs avatar Aug 22 '23 02:08 MarkTangs

我也遇到这个问题了

bossjob-caesar avatar Aug 24 '23 10:08 bossjob-caesar

用一个原生的VC装一下Container,然后在VC的dealloc中,remove Container

` public lazy var flutterVC: FBFlutterViewContainer = { let container = FBFlutterViewContainer() return container! }()

func setupUI() { addChild(flutterVC) view.addSubview(flutterVC.view) flutterVC.view.frame = view.bounds
}

public func configFlutter(name: String, uniqueId: String?, params: [AnyHashable : Any]?, opaque: Bool) {
    flutterVC.setName(name, uniqueId: uniqueId, params: params, opaque: opaque)
}

deinit { NotificationCenter.default.removeObserver(self) flutterVC.removeFromParent() } `

Wangkai2024 avatar Nov 29 '23 12:11 Wangkai2024

问题是返回没有释放内存,重新点击进去之后释放内存,如果内存一直不释放,那么就会不断增加,可能原因: 容器中增加addEventListener,但是这个目前不能手动释放,导致容器不会走 -(void)dealloc { if (self.removeEventCallback != nil) { self.removeEventCallback(); } [NSNotificationCenter.defaultCenter removeObserver:self]; }

2015IWillBack avatar Feb 20 '24 07:02 2015IWillBack