0

slodgeが提供するmvvmcrossフレームワークを使用して、モノドロイドを使用しています。しかし、私はいくつかのメモリの問題を抱えています。メソッドを破棄するアクティビティでビットマップを破棄していますが、GCがビューモデルの未使用のオブジェクトを収集するのに役立つかどうか疑問に思っています。アクティビティのビューモデルをnullに設定しようとすると、すべてが地獄に落ちてしまい、明らかに正しい方法ではありません。

アプローチについて何か提案はありますか?

よろしく

4

1 に答える 1

1

mvxフレームワークは、アクティビティがビューモデルを所有していることを確認しようとします。

したがって、理論的には、アクティビティが破棄された後、gcはすべてのc#オブジェクト(アクティビティ、所有するビュー、ビューモデル、および所有するオブジェクト)を収集できるはずです。

これがうまくいかないのを見たのは、「グローバル」またはシングルトンオブジェクトがビューまたはviewmodelオブジェクトへの参照を所有している場合です。例えば:

  • ビューがそれ自体をシングルトン(たとえばhttpイメージローダー)に登録し、そのシングルトンがビューへの参照を保持し、ガベージコレクションが行われないようにする場合。

  • ビューモデルが中央サービス(多くの場合シングルトン)のイベントをサブスクライブし、サブスクライブを解除しない場合、この状況では、ビューモデルをガベージコレクションできません(多くの場合、これにより他のオブジェクトも収集されなくなります)

一般に、これらのタイプのエラーは両方とも、アクティビティの破棄に対してクリーンアップアクションを実行することで解決できます。ただし、他のアプローチも利用できます。たとえば、イベントサブスクリプションの場合、弱参照を使用して試すことができます(これは、他のプラットフォームでも採用されているアプローチです-たとえば、mvvm lightのメッセンジャー)

経験から、リークが最も目立つ領域は、画像のような「大きなオブジェクト」の周りです。それらのサイズは、それらが目立つようになるのに役立ちます。ただし、monodroidの実際の課題は、リークがどこにあるかを特定することです。リークの修正は一般に比較的簡単です。

残念ながら、現在、droidで使用できるメモリプロファイラーはありません。wp7にクロスコンパイルしている場合は、確かにviewmodelオブジェクト/リークに対してそのメモリプロファイラーを使用できます。そうでない場合、私が一般的にメモリリークを解決しようとする方法は、それらを増幅することです-たとえば、データ要素に大きなbyte []メンバーを追加するか、アクションをすばやく繰り返すことによって、それらを迅速に再現するサンプルを作成してみてください。リークを簡単に再現できたら、ファイナライザーにトレースステートメントを配置したり、ハンドラーを削除したりすることで、リークを見つけることができます。

于 2012-09-25T07:18:36.167 に答える