1

この状況が危険かどうかについて、私は少し混乱しています。

コールバック リスナーへの参照を含むオブジェクトがあります。オブジェクト内の特定のイベントで、コールバック リスナーが呼び出されます。抽象コールバック関数の実装により、オブジェクトへの既存の参照のみが削除されます。コールバックが戻ると、イベント ハンドラーで他​​のことを行い、メンバーを操作することもあります。

このオブジェクトへの唯一の参照がなくなったので、Dalvik JVM ガベージ コレクターは、イベント ハンドラーで残りの作業を行っているにもかかわらず、私のオブジェクトをガベージ コレクションしようとしますか? そして、これの結果はどうなりますか?

私の状況を説明するために、単純でかなり役に立たないコードをいくつか書きました。

public SomeClass {

  public abstract class CallBackListener {
    public void abstract callback();
  }

  private CallBackListener mCb = null;
  private OrgObject mObject = null;

  public SomeClass() {
    mCb = new CallBackListener() {
      @Override
      public void callback() {
          mObject = null;
      }
    };
    mObject = new OrgObject(mCb);
  }
}

public class OrgObject {

  private SomeClass.CallBackListener mCb = null;

  public OrgObject(SomeClass.CallBackListener cb) {
    mCb = cp;
  }

  public void event() {
    //call callback
    cb.callback();

    //do other stuff
  }
}

この状況および/または実践に関する情報はありますか?

前もって感謝します

4

4 に答える 4

2

いいえ; 実行中のスレッドがアクセスできるオブジェクトは、ガベージ コレクションの対象になりません。

オブジェクトに属するメソッドを実行している間、オブジェクト自体はthis参照 (スレッド実行スタックに格納されている) を使用して常にスレッドにアクセスできるため、ガベージ コレクションを実行することはできません。オブジェクトへの他の参照が残っていない場合、スレッドがメソッドを終了するときにオブジェクトが gc される可能性があります。

于 2013-09-26T08:45:13.250 に答える
0

このような説明です

しかし、受け入れられた回答では、コールバックの問題が考慮されていません。しかし、コメントは、この参照も有効な参照としてカウントされることを示唆しています....しかし、これはいつ無効になり、ガベージコレクションのために開かれますか?

于 2013-09-26T08:45:12.853 に答える
0

event() メソッドが実行されている間、OrgObject (mObject) への参照があります。と呼ばれていthisます。いいえ、GC はオブジェクトを収集しません。それに、「実行」クラスを集めたら、かなり奇妙です。そう思わない?

于 2013-09-26T08:45:46.473 に答える