Flutter 中的内存周期

Sp1*_*ire 4 delegates memory-leaks ios automatic-ref-counting flutter

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

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);
}
Run Code Online (Sandbox Code Playgroud)

因此,MainScreen对AnotherClass有很强的引用,而 AnotherClass 对 MainScreen 有很强的引用。那么,flutter 中的内存管理是否存在任何问题,或者这只是 iOS 的 ARC(自动引用计数)相关问题?iOS 中的修复方法是将委托标记为弱。

jam*_*lin 5

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

\n

由于垃圾收集器异步运行并且处理许多可能死亡的对象的频率有些低,因此它们通常可以承担更昂贵的操作,例如检测和处理内存周期。(例如,他们可以标记所有当前可到达的对象并删除其他所有对象,这个过程称为标记和清除。)

\n

关于 Dart 垃圾收集器的附加阅读:

\n\n

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

\n

Dart 2.17 添加了一个WeakReference类,早期版本有对象形式的弱引用的概念Expando),但它们在可使用的类型方面略有限制。它们不经常使用;的主要动机WeakReference是与 一起使用dart:ffi

\n