flutter - 当引用丢失时,垃圾收集器会关闭流控制器吗?
问题描述
StreamController
我对 dart 中的实际实现方式感到非常困惑。所以告诉我这段代码是否会导致任何内存泄漏。
class Backend{
final streams = <int,StreamController>{};
final ws;
StreamHandler(this.ws){
listenToWebSocket();
}
listenToWebSocket(){
ws.listen((e){
streams[e['index']].add(e['data']);
});
}
getStream(int index){
var s = StreamController();
streams[index] = s;
return s.stream;
}
}
Backend
侦听 websocket 并将其数据传递给流适当的索引。
class StreamListenerHandler{
Map<int,StreamListener> listeners = {};
addListener(int index){
map[index] = listeners;
}
}
class StreamListener{
final int index;
StreamListener(this.index){
startListening();
}
startListening(){
getIt<Backend>().getStream().listen((data){
//do stuff
});
}
}
StreamListener
想要 websocket 数据。StreamListenerHandler
存储监听器。(对于那些不知道 getIt 包的人只访问全局单例类型的东西。)那么如果......
void main(){
var handler = StreamListenerHandler();
handler.addListener(5);
// after some time...
handler.addListener(5);
}
在第一次调用addListener
aStreamListener
时,它会从Backend
.
这是我对第二次电话
的期望……用新电话StreamListenerHandler
替换当前电话StreamListener
。然后新的 StreamListener 调用Backend
并获得一个新的流。旧的 streamController 没有引用,所以它被处理掉了。对于 old StreamListener
, 中的引用StreamListenerHandler
丢失了,并且由于旧的 streamController 消失了,listen 回调也毫无价值,因此将被丢弃。
所以我什么都没有关闭,只是删除了引用。这会导致内存浪费吗?
垃圾收集器在控制器上调用 close 还是仅处理对象就足够了?
(我问这一切是因为整个互联网上的人都在说你应该关闭流。我不喜欢“应该”。我只想在“需要”时才这样做)
解决方案
推荐阅读
- hadoop - Pig - 表达式不是项目表达式:(名称:ScalarExpression)类型:null Uid:null)
- c# - 如何在 Entity Framework Core 中更新具有私有属性的模型?
- firebase - 如何在 Flutter Firebase 应用中搜索并向附近的人发送通知?
- javascript - 对话框上的按钮无法在量角器中单击或选择
- javascript - 我无法让我的 JavaScript 代码在我的 HTML 文件中工作
- python - 即使整个管道都安装了管道中的 Sklearn 组件?
- gcc - 无法将 COFF 对象链接到葡萄酒
- git - 即使在更新 git index 之后,git status 也会显示已删除的文件
- php - preg_match 删除杂散的 HTML
- c# - c# 中的 FileStream - 检测流位置变化?