MVVMCrossは、主に弱い参照を使用して、イベントサブスクリプションのごみ収集を保証します。これがそれがどのように機能するかの詳細な説明です:
MVVMCrossメッセンジャーの概要
MVVMCross Messengerプラグインは、コンポーネント間のイベントの集約を容易にするように設計されています。これにより、コンポーネントはメッセージを公開および購読することで通信できます。メッセンジャーは、イベントサブスクリプションに弱い参照を使用します。これは、ゴミコレクターがもはや参照されていないオブジェクトを削除できるようにすることで、メモリリークを防ぐのに役立ちます。
mvvmcrossの弱い参照
MVVMCross Messengerを使用してメッセージをサブスクライブする場合、弱いリファレンスを使用するか強力な参照を使用するかを指定できます。デフォルトでは、MVVMCrossはサブスクリプションに弱い参照( `mvxreference.weak`)を使用します。これは、メッセンジャーがコールバックメソッドへの強力な参照を保持しないことを意味し、サブスクライブしたオブジェクトが範囲外になった場合、ガベージコレクターがサブスクリプションを削除できるようにします。
##サブスクリプションとサブスクリプション
サブスクリプションは、いくつかの方法を使用して管理できます。
- 購読:メッセージは公開スレッドに直接渡されます。
-subscribeonmainthread:メッセージはメインのUIスレッドにマーシャリングされます。
-subscribeonthreadpoolthread:メッセージはスレッドプール処理用にキューに掲載されています。
各サブスクリプションメソッドは、「mvxsubscriptiontoken」を返します。これは、メッセージからの登録解除に使用できます。ただし、トークンが保存されていない場合、サブスクリプションはすぐにガベージを収集する場合があります。
##ゴミ収集メカニズム
MVVMCrossのゴミ収集メカニズムは、範囲外に収集されたガベージである「MVXSubscriptionToken」に依存しています。サブスクリプショントークンが保存されていない場合、ガベージコレクションの対象となります。これにより、イベントハンドラーの妨害につながる可能性があります。このアプローチにより、イベントサブスクリプションのためにオブジェクトが不必要にメモリに保持されないことが保証されます。
##サブスクリプションステータスの観察
MVVMCrossは、「hassubscriptionsfor」や「countSubscriptionsfor」などの現在のサブスクリプションステータスを観察する方法も提供します。さらに、メッセンジャーは、サブスクリプションが追加、削除、または期限切れになるたびに「MVXSubscriberChangeMessage」メッセージを公開し、現在のサブスクリプション状態に基づいてコンポーネントが動作を適応させることができます。
##メモリ管理のためのベストプラクティス
効果的なゴミ収集を確保し、メモリの漏れを防ぐには:
- 可能な場合は、イベントサブスクリプションに弱い参照を使用します。
- サブスクリプションを明示的に管理する必要がある場合は、サブスクリプショントークンを保存します。
- 特に強力な参照を使用する場合は、イベントが不要になったときに登録解除します。
- ビューモデルやビューなど、ゴミ収集されるべきオブジェクトへの強い参照を維持しないでください。
これらのプラクティスに従い、MVVMCrossの弱いサブスクリプションメカニズムを活用することにより、開発者はイベントサブスクリプションがオブジェクトがゴミ収集されないようにし、アプリケーションで効率的なメモリ管理を維持しないようにすることができます。
引用:[1] https://www.mvvmcross.com/documentation/plugins/messenger
[2] https://stackoverflow.com/questions/39315395/mvvmcross-best-way-to-raise-event-in-viewmodel
[3] https://stackoverflow.com/questions/12494804/helping-the-gc-in-droid-using-mvvmcross
[4] https://gregshackles.com/weak-subscription-gotcha-in-mvvmcross/
[5] https://github.com/mvvmcross/mvvmcross/issues/2145
[6] https://livebook.manning.com/book/xamarin-in-caction/b-using-mvvm-light-instead-of-mvvmcross/V-15/
[7] https://stackoverflow.com/questions/30798429/mvvmcross-android-viewmodel-never-garbage-collected
[8] https://www.mvvmcross.com/documentation/advanced/customizing-using-app-and-setup
[9] https://www.spicelogic.com/blog/net-event-handler-memory-leak-16