根据我对 Dart 的理解,Stream
任何听众都将被保留作为参考,直到StreamSubscription.cancel()
被调用。这意味着在流也被销毁之前,我的监听对象不会从内存中删除。
一旦我不再需要该对象,是否有任何标准模式可以确保我取消所有内部侦听器?这甚至是 Dart 中的一个问题,还是我误解了这个概念?
我能想到的一个解决方案是一个destroy
orcancelSubscriptions
方法,一旦我知道不再需要对象,就必须手动调用它。
根据我对 Dart 的理解,Stream
任何听众都将被保留作为参考,直到StreamSubscription.cancel()
被调用。这意味着在流也被销毁之前,我的监听对象不会从内存中删除。
一旦我不再需要该对象,是否有任何标准模式可以确保我取消所有内部侦听器?这甚至是 Dart 中的一个问题,还是我误解了这个概念?
我能想到的一个解决方案是一个destroy
orcancelSubscriptions
方法,一旦我知道不再需要对象,就必须手动调用它。
如果订阅者和引用流的实例都受到垃圾收集(某些活动实例未引用)的影响,则连接不应该计算在内,并且两个实例都应该被垃圾收集(但我不确定这一点)。
我还没有看到任何模式。
当我只想取消所有订阅时,我将它们存储在一个集合中并运行
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 方法
但不确定是否会实施。
还有相关的: