Flutter 中的内存循环

Memory Cycles in Flutter

大家好,我是一名 iOS 开发人员,正在构建 Flutter 应用程序,我想知道是否存在内存循环(保留循环)的概念。 “强引用循环会对应用程序的性能产生负面影响。它们会导致内存泄漏和通常难以调试的意外行为”。 通过替换 strong引用引用,对象之间的关系保持完整,强引用循环被打破。所以在 flutter 中没有关于 weak 引用的概念。那么你如何解决这个问题,或者没有必要这样做呢?下面我举个例子。

abstract class MainScreenDelegate {
  didTapButton();
}

class MainScreen implements MainScreenDelegate {
 AnotherClass anotherClass;

  @override
  void initState() {
    anotherClass = AnotherClass(this);
  }

  @override
  void didTapButton() { }
}

class AnotherClass {
 MainScreenDelegate delegate;
 AnotherClass(this.delegate);
}

所以 MainScreenA​​notherClass 有强引用,而 AnotherClass 对 MainScreen 有强引用。那么关于 flutter 中的内存管理是否存在任何问题,或者这只是关于他们的 ARC(自动引用计数)的 iOS 相关问题? iOS 中的一个修复是将委托标记为弱。

Dart 使用 garbage collector. Apple's ARC 不使用垃圾收集器;一旦对象未被引用,它们就会立即同步释放。这有一些优点(可预测的、确定性的行为)但也有一些缺点(由相互引用创建的循环)。

由于垃圾收集器 运行 异步处理 许多 潜在死对象,因此它们通常可以负担得起执行更昂贵的操作,例如检测和处理内存周期。 (例如,他们可以标记所有当前可访问的对象并删除其他所有对象,这个过程称为 mark-and-sweep。)

关于 Dart 垃圾收集器的补充阅读:

所以通常你不需要担心 Dart 中的内存循环。但是,这并不意味着您不能“泄漏”内存。例如,如果您在一个对象上注册了一个回调但从未注销它,只要该回调保持注册状态(因此可以访问),它就会保持对该对象的引用并使其保持活动状态。

Dart 确实(有点)以 Expando 对象的形式存在弱引用的概念,但它们并不经常使用并且有一些限制。