Javaの循環参照は、GCでは問題になりません。これは「到達可能性」と呼ばれる概念のために問題ではありません。
オブジェクト参照は有向グラフ、ノードはオブジェクト、エッジはオブジェクト参照と考えることができます。グラフには、 "ルートノード"と呼ばれる一連のノードがあります。これらは、VM内のあるスレッドが直接アクセスできるオブジェクト(大まかに)です。スタック上の関数呼び出しのローカル変数、クラス内の静的フィールドなど
ガベージコレクションを実行すると、VMはこれらのルートノードから開始し、それらを「使用中」としてマークします。次に、これらの使用中ノードから導出される各エッジ(すなわち、使用中のオブジェクトから参照される各オブジェクト)に対して、使用中であることをマークするなど、何も残されない限りマーク。そして、「使用中」としてマークされていないオブジェクトは、ガベージコレクションを安全に行うことができます。あなたは今、aとbの間で循環参照を持っている
a = new A();
a.b = b;
b = new B();
b.a = a
:
さて、たとえばあなたには、いくつかの方法にしている、とあなたは、次のコードを持っているとしましょう。これらのオブジェクトは両方とも、スタック上にあるメソッド呼び出しのローカル変数であるため、ルートセットの一部です。
この方法を終了すると、aとbの両方がルートセットに含まれなくなります。そして、あなたが他の場所への参照をしない限り、aまたはbへの参照を保持するものは他にありません。
これで、オブジェクト参照グラフにaとbが含まれているグラフの接続が少し外れてしまいます。彼らはまだお互いの参照を持っていますが、他には何も言及していません。ルートセットから到達できないため、GCは使用されていないことを認識し、ガベージコレクションを行うことができます(互いに参照があっても)。
(これはガベージコレクションのやや単純化した説明ですが、それはまだそれがどのように動作するかの便利/合理的なメンタルモデルであることに注意してください)
だから、短い答えは - 「はい、あなたは循環参照を持っていますしかし、これは問題ではありません。なぜなら、両方のオブジェクトは、どちらももう到達不可能になると収集されるからです。 "
jusrがあなたの参照(ImageView - > ClassAインスタンスのID)を追跡するために独自のHashSet ? –
Olegas