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);
}
所以 MainScreen 对 AnotherClass 有强引用,而 AnotherClass 对 MainScreen 有强引用。那么关于 flutter 中的内存管理是否存在任何问题,或者这只是关于他们的 ARC(自动引用计数)的 iOS 相关问题? iOS 中的一个修复是将委托标记为弱。
Dart 使用 garbage collector. Apple's ARC 不使用垃圾收集器;一旦对象未被引用,它们就会立即同步释放。这有一些优点(可预测的、确定性的行为)但也有一些缺点(由相互引用创建的循环)。
由于垃圾收集器 运行 异步处理 许多 潜在死对象,因此它们通常可以负担得起执行更昂贵的操作,例如检测和处理内存周期。 (例如,他们可以标记所有当前可访问的对象并删除其他所有对象,这个过程称为 mark-and-sweep。)
关于 Dart 垃圾收集器的补充阅读:
- Flutter: Don’t Fear the Garbage Collector。 (然而,本文并未直接解决您的问题。)
所以通常你不需要担心 Dart 中的内存循环。但是,这并不意味着您不能“泄漏”内存。例如,如果您在一个对象上注册了一个回调但从未注销它,只要该回调保持注册状态(因此可以访问),它就会保持对该对象的引用并使其保持活动状态。
Dart 确实(有点)以 Expando
对象的形式存在弱引用的概念,但它们并不经常使用并且有一些限制。
大家好,我是一名 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);
}
所以 MainScreen 对 AnotherClass 有强引用,而 AnotherClass 对 MainScreen 有强引用。那么关于 flutter 中的内存管理是否存在任何问题,或者这只是关于他们的 ARC(自动引用计数)的 iOS 相关问题? iOS 中的一个修复是将委托标记为弱。
Dart 使用 garbage collector. Apple's ARC 不使用垃圾收集器;一旦对象未被引用,它们就会立即同步释放。这有一些优点(可预测的、确定性的行为)但也有一些缺点(由相互引用创建的循环)。
由于垃圾收集器 运行 异步处理 许多 潜在死对象,因此它们通常可以负担得起执行更昂贵的操作,例如检测和处理内存周期。 (例如,他们可以标记所有当前可访问的对象并删除其他所有对象,这个过程称为 mark-and-sweep。)
关于 Dart 垃圾收集器的补充阅读:
- Flutter: Don’t Fear the Garbage Collector。 (然而,本文并未直接解决您的问题。)
所以通常你不需要担心 Dart 中的内存循环。但是,这并不意味着您不能“泄漏”内存。例如,如果您在一个对象上注册了一个回调但从未注销它,只要该回调保持注册状态(因此可以访问),它就会保持对该对象的引用并使其保持活动状态。
Dart 确实(有点)以 Expando
对象的形式存在弱引用的概念,但它们并不经常使用并且有一些限制。