Flutter iOS 版应用因消耗高内存而崩溃

Ram*_*han 6 android memory-leaks ios dart flutter

我使用 Bloc 模式开发了一个 flutter 应用程序。一切都很好,直到我们在 iOS 中遇到内存崩溃。Android 版本运行良好,没有任何内存问题。但该应用程序的 iOS 版本确实存在内存问题。当导航到另一个页面或每个后台同步时,内存会保持在同一页面上不断累积(即使没有导航也会增加内存)。最终,应用程序因 Xcode 控制台中的“因内存问题而终止”而崩溃。我试过了:

  1. 关闭流
  2. 优化代码
  3. 关闭所有集团。
  4. 使用 Xcode Instruments 查看内存堆(它显示内存泄漏,但没有太多关于保留的任何方法或对象的信息。)
  5. 使用 Dart DevTools 来分析应用程序。不过,可用的信息并不多。
  6. 使用“天文台”查看内存是否在任何特定区域累积。但是没有用。

Android 版本运行良好。仅适用于 iOS 的问题是什么?我们是否需要明确地在 flutter 中做一些其他的事情来释放 iOS 中的内存?由于我正在关闭块和流,理想情况下应该在关闭它们的同时处理内存,对吗?请参阅随附的屏幕截图,其中显示了 Xcode 中的内存堆。

Xcode 中的内存堆

Rin*_*cha 3

您应该提供更多信息,即使您不放置代码,至少也应该提供您在应用程序/网络中使用的组件类型。例如,一些导致内存崩溃的组件通常是缓存图像、视频播放器、视频流、糟糕的数据缓存管理、渲染非常重的图像……

关于图像缓存有几个众所周知的建议,例如,如果您正在使用CachedNetworkImage,请不要忘记添加memCacheHeightmemCacheWidth参数。

当代码检测到状态对象永远不会再次构建时,您还可以尝试清理对象。

文档: https: //api.flutter.dev/flutter/widgets/NavigatorState/dispose.html

示例:

@override
void dispose() {
  focusScopeNode.dispose(); 
  for (final _RouteEntry entry in _history)
    entry.dispose();
  super.dispose();
}
Run Code Online (Sandbox Code Playgroud)

此外,您还必须检查如何使用导航器更改路线。您使用导航器Navigator.pushReplacementNamed()Navigator.pushReplacement()推送...吗?也许你的屏幕正在堆叠。