1

Dart の私の理解では、リスナーは呼び出されるStreamまで参照として保持されます。StreamSubscription.cancel()これは、ストリームが破棄されるまで、リッスンしているオブジェクトがメモリから削除されないことを意味します。

オブジェクトが不要になったら、すべての内部リスナーを確実にキャンセルするための標準パターンはありますか? これは Dart の問題でもありますか、それとも概念を誤解していますか?

私が考えることができる 1 つの解決策は、オブジェクトが不要になったことがわかったら、手動で呼び出さなければならないdestroyorメソッドです。cancelSubscriptions

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 がデストラクタまたは破棄メソッドを呼び出す機能のリクエストがあります。

しかし、これが実装されるかどうかは不明です。

関連:

于 2014-09-30T14:25:27.410 に答える