Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon mvvmcrossでの弱者を使用することと強い参照を使用することの違いは何ですか


mvvmcrossでの弱者を使用することと強い参照を使用することの違いは何ですか


MVVMCrossでは、他のフレームワークと同様に、弱者を使用することと強い参照を使用することの選択は、メモリの管理とメモリリークの防止に不可欠です。 MVVMCrossのコンテキストでの違いとそれらがどのように適用されるかについての詳細な説明を次に示します。

###強い参照

**強力な参照は、C#を含むほとんどのプログラミング言語でのデフォルトの参照タイプです。オブジェクトが強く参照されると、オブジェクトへのすべての強い参照が削除されるまで、ゴミコレクターはそれを収集できません。これは、オブジェクトへの少なくとも1つの強力な参照がある限り、メモリにとどまることを意味します。

MVVMCrossでは、適切に管理されていないと、強力な参照がメモリリークにつながる可能性があります。たとえば、ViewModelがビューへの強力な参照を保持し、ビューがViewModelへの強力な参照も保持している場合、保持サイクルが作成されます。これにより、両方のオブジェクトが必要でない場合でも、両方のオブジェクトが収集されるのを防ぎます。

###弱い参照

**弱い参照は、一方で、強い参照が存在しない場合は、ガベージコレクターが参照されるオブジェクトを収集できるようにします。これは、オブジェクトが不要になった場合にガベージを収集することを許可したいシナリオで特に役立ちますが、たまたま利用可能な場合はアクセスしたいと考えています。

MVVMCrossでは、ビューモデルとビュー間のサイクルを保持することを避けるために、弱い参照を使用することが推奨されます。たとえば、ViewModelにビューを強く参照する代わりに、弱い参照またはメッセージングシステムを使用してそれらの間で通信できます。これにより、ViewModelがまだ存在する場合でも、ビューが不要になったときにガベージが収集されることが保証されます。

MVVMCrossの実用的な例

一部のデータがロードされたときにViewModelがビューに通知する必要があるシナリオを考えてみましょう。一般的なアプローチは、ビューが購読するViewModelでイベントを使用することです。ただし、ビューがこのイベントに強く購読している場合、ビューモデルからビューに戻る強力な参照を作成します。これにより、ビューが収集されるのを防ぐことができます。

これを回避するために、MVVMCrossは「weakSubscribe」などの方法を提供します。これにより、ビューはビューモデルのイベントを弱く購読できます。このようにして、ViewModelはビューへの強力な参照を保持せず、メモリの漏れを防ぎます。

MVVMCrossで弱い参照を使用するためのガイドライン

- ビューに弱い参照を使用する:ビューモデルがビューと対話する必要がある場合、弱い参照またはメッセージングシステムを使用してサイクルを保持しないようにします。
- ビューへの強力な参照を避けてください:ビューモデルがビューを強く参照しないようにして、ビューが不要になったときにガベージを収集できるようにしてください。
- メッセージングシステムの使用:MVVMCrossの「imvxmessenger」などのメッセージングシステムを使用して、強力な参照を作成せずにビューモデルとビュー間で通信することを検討してください。

これらのガイドラインに従うことにより、MVVMCrossアプリケーションでメモリを効果的に管理し、メモリリークなどの一般的な問題を防ぐことができます。

引用:
[1] https://stackoverflow.com/a/19379912
[2] https://forums.swift.org/t/unowned-References-have-more-overhead-than-strong-References/72765
[3] https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/weak-references
[4] https://www.reddit.com/r/swift/comments/8ifwy9/ios_mvvm_breaking_retainer_cycle_between/
[5] https://stackoverflow.com/questions/40966271/weak-reference-and-strong-reference
[6] https://langdev.stackexchange.com/questions/1351/approaches-for-implementing-weak-References
[7] https://putridparrot.com/blog/weakreferences-in-net/
[8] http://java-latte.blogspot.com/2014/07/difference-between-strongreference-weakreference-softrencerion-phantomreference-in-java.html