未调用cancel()时,Dart的StreamSubscription会无限期存活吗?
Dart中未手动调用cancel()的StreamSubscription被GC回收时,流会自动取消吗?
答案是不会,别指望GC帮你做这个事。
Dart里的StreamSubscription本身没有绑定GC回收时的自动取消逻辑。更关键的是,多数情况下Stream会持有订阅者的引用(比如广播流会维护一个订阅列表),如果你不手动调用cancel(),哪怕你的代码里已经没有这个Subscription的引用了,Stream那边还攥着它,GC根本收不掉这个订阅对象,流还会继续往这个“没人管”的订阅发事件,白白消耗资源,严重的还会导致内存泄漏。
举个实际例子:你用Stream.periodic(Duration(seconds: 1), (i) => i)创建了一个每秒发事件的流,订阅后如果不cancel,就算你把页面关了、组件销毁了,这个流还是会一直跑下去,直到整个程序退出。
所以不管什么时候,手动调用cancel()都是必须的最佳实践——比如在StatefulWidget的dispose()方法里,一定要记得取消所有相关的StreamSubscription,别偷懒。
内容的提问来源于stack exchange,提问作者Scorb
相关产品推荐
相关产品推荐

