2017-05-17 11 views
-1

私はAndroidの用語を使用してこの例を作成しますが、すべてのオブジェクト指向プログラミングでは同じだと思います。名前の名前FragmentAFragmentBとインターフェースを持つ2つの断片(クラス)がある場合インターフェイスは強くまたは弱い参照ですか?

Interface1

FragmentAは、インタフェースのインターフェース1」を実装します。

FragmentAオブジェクトはFragmentBというオブジェクトを作成し、それを強力な参照インスタンス変数として格納します。

FragmentAは、オブジェクト作成の一部としてFragmentBのコンストラクタに(実装はInterface1)を渡します。

FragmentBは、という強力な参照インスタンス変数としてInterface1実装オブジェクト(この場合はFragmentAのオブジェクト)を格納します。

1- mInterface1ObjFragmentBは、FragmentAオブジェクトへの強い参照を保持しますか?

2-このシナリオではメモリリークが発生しますか?

3-メモリリークを避けるために、mInterface1Objは弱い参照(Interface1 mInterface1Objの代わりにWeakReference<Interface1> mInterface1Obj)にする必要がありますか?

+3

あなたは完全に無関係の概念を混乱させる。インタフェースは参照強度やメモリリークとは関係ありません。オブジェクトが不必要に参照されない限り、シナリオには固有のメモリリークはありません。 – shmosel

答えて

-3

FragmentBのmInterface1Objは、FragmentAオブジェクトへの強い参照を保持していますか?

はい。それまでWeakReferenceオブジェクトに参照を保持しない限り、常に強い参照を保持します。

このシナリオではメモリリークが発生しますか?

あなたがスタックからFragment1を削除し、Fragment2がFragment2がFragment1の強い参照を保持しているように、メモリリークが発生しますこのような場合には、スタックに残るかどうかは、あなたのフラグメントスタック、例えば、依存しています。

メモリーリークを避けるために、mInterface1Objを弱参照(WeakReference mInterface1Obj = Interface1 mInterface1Obj)にする必要がありますか?

これは正しい方法です。

+2

私はあなたの答えの書式設定をしたいと思う...これはこのように読むのは非常に難しいです。 – GhostCat

+0

フォーマットのほかに、答え自体は間違っています。メモリリークが発生するかどうかは、スタックナビゲーションだけでなく、多くのことに依存します。弱い参照を保持することは自動的に正しいことではありません。 –

+0

@LewBlochあなたは多くのことに依存していますが、ここでは一つの例を挙げます。提供された例ではメモリリークは起こりませんか? – Avi

関連する問題