首页 > 解决方案 > 当引用丢失时,垃圾收集器会关闭流控制器吗?

问题描述

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);
}

在第一次调用addListeneraStreamListener时,它会从Backend.
这是我对第二次电话
的期望……用新电话StreamListenerHandler替换当前电话StreamListener。然后新的 StreamListener 调用Backend并获得一个新的流。旧的 streamController 没有引用,所以它被处理掉了。对于 old StreamListener, 中的引用StreamListenerHandler丢失了,并且由于旧的 streamController 消失了,listen 回调也毫无价值,因此将被丢弃。
所以我什么都没有关闭,只是删除了引用。这会导致内存浪费吗?
垃圾收集器在控制器上调用 close 还是仅处理对象就足够了?
(我问这一切是因为整个互联网上的人都在说你应该关闭流。我不喜欢“应该”。我只想在“需要”时才这样做)

标签: flutterdartstream

解决方案


推荐阅读