クラス自体を削除した場合、その内部メソッドの実行を停止する必要がありますか? クラスAにAのArrayListからBを削除するように指示するクラスBがあります。B は A の ArrayList にしか存在しないと確信しているので、B を削除するときは削除する必要がありますよね?(注:VMがクラスを処理する方法に関係がある場合に備えて、シリアル化可能な実装を含めましたが、ここでは read- および writeObject メソッドを記述しませんでした。それが何か関係があるとは思えませんこの問題ですが。)
public class A implements Serializable, B_Listener {
ArrayList<B> bArray;
public A() {
bArray = new ArrayList<SomeObject>();
bArray.add(new B(bArray.size(), this));
}
@Override
public void deleteAtIndex(int index) {
bArray.remove(index);
}
}
public class B implements Serializable {
B_Listener listener;
int index;
public B(B_Listener listener, int index) {
this.listener = listener;
this.index = index;
}
//This is called at some point in a B's lifetime.
private void selfDestruct() {
listener.deleteAtIndex(index);
Log.w("B.class", "Should this not output? It does.");
}
}
public interface B_Listener {
public void deleteAtIndex(int index);
}
そのため、Log.w メッセージは実行すべきでないと思われるときに実行されます。したがって、Java のメモリ リークを作成していると思います。B がポインターによって保持されている可能性がある場所を見つけようとして、コード全体を調べましたが、意図したもの以外には何も思いつきませんでした。
それで、Bが私の側で削除されたときとは異なるときにガベージが収集されるかどうかを尋ねています。もしそうなら、当分の間、私は実際に私が保持するつもりのないオブジェクトを保持していないと言っても過言ではありませんか?
余分な(注:これは従うのが難しいかもしれません、これ以上のすべてが問題に十分であるはずです):私はAndroidで開発しているので、これもAndroid-Viewsでタグ付けされています:私のBクラスは、Bを指すViewオブジェクトをリスナー。ビューを削除すると、ビュー マネージャーまたは Android が持っているものはすべてビューを指しなくなるはずです。B を削除すると、その内部ビューもすべて削除する必要があります。つまり、独自のリスナーによって B が存在し続けることはできなくなります。ポインター。ここでの私の理解が正しいかどうかを確認するために、これについて話しているだけです。