1

根据我对 Dart 的理解,Stream任何听众都将被保留作为参考,直到StreamSubscription.cancel()被调用。这意味着在流也被销毁之前,我的监听对象不会从内存中删除。

一旦我不再需要该对象,是否有任何标准模式可以确保我取消所有内部侦听器?这甚至是 Dart 中的一个问题,还是我误解了这个概念?

我能想到的一个解决方案是一个destroyorcancelSubscriptions方法,一旦我知道不再需要对象,就必须手动调用它。

4

1 回答 1

1

如果订阅者和引用流的实例都受到垃圾收集(某些活动实例未引用)的影响,则连接不应该计算在内,并且两个实例都应该被垃圾收集(但我不确定这一点)。

我还没有看到任何模式。
当我只想取消所有订阅时,我将它们存储在一个集合中并运行

subscriptions.forEach(s) {
  s.cancel();
}
subscriptions.clear();

当我想在不同情况下取消重新订阅时,我会为每个此类订阅创建一个变量。

var someSubscr = xxx.listen(...);

...

if(someSubscr != null) someSubscr.cancel();
someScubscr = null;

我只在 Polymer 元素中使用了它detached,并用于取消订阅和attached订阅。
当我在其他情况下需要时,我只需将上述代码放入一个dispose方法中,并在我知道不再需要该实例时调用它。

我认为为应该有方法的类创建一个接口并实现它会很好dispose

abstract class Disposable {
  void dispose();
}

当您有某种为您创建实例的工厂并且您不确定实例是否需要dispose在您完成使用时调用它时,只需添加此行就可以确保安全。

if(x is Disposable) x.dispose();

有一个功能请求让 VM 调用析构函数或 dispose 方法

但不确定是否会实施。

还有相关的:

于 2014-09-30T14:25:27.410 回答