MVVMCross, seperti kerangka kerja lainnya, menghadapi tantangan dengan kebocoran memori yang disebabkan oleh langganan peristiwa. Kebocoran ini terjadi ketika suatu objek berlangganan suatu peristiwa dan gagal untuk berhenti berlangganan, menyebabkan objek tetap dalam memori bahkan setelah itu tidak lagi diperlukan. Begini cara MVVMCross menangani skenario seperti itu:
Memahami kebocoran event handler
Kebocoran event handler adalah umum dalam pemrograman yang digerakkan oleh peristiwa. Ketika objek berumur pendek berlangganan suatu peristiwa dari objek yang berumur panjang, objek yang berumur panjang memegang referensi ke objek yang berumur pendek, mencegahnya menjadi sampah yang dikumpulkan. Ini adalah masalah yang signifikan dalam kerangka kerja seperti MVVMCross, di mana tampilan dan model tampilan berinteraksi secara luas melalui peristiwa.
pendekatan mvvmcross
MVVMCross menyediakan mekanisme untuk mengelola langganan acara dan mengurangi kebocoran memori:
1. Referensi yang lemah: MVVMCROSS menggunakan referensi yang lemah untuk membantu mengelola langganan. Referensi yang lemah memungkinkan pengumpul sampah untuk mengumpulkan objek bahkan jika dirujuk, tetapi pendekatan ini dapat menyebabkan langganan yang hilang untuk model tampilan aktif. Oleh karena itu, sangat penting untuk menyeimbangkan antara menggunakan referensi yang lemah dan kuat berdasarkan kebutuhan aplikasi [11].
2. Pola Messenger: MVVMCross menggunakan pola messenger, yang memungkinkan model tampilan untuk berkomunikasi tanpa memegang referensi yang kuat satu sama lain. Pola ini dapat menggunakan referensi yang lemah untuk mencegah kebocoran memori tetapi membutuhkan manajemen yang cermat untuk menghindari kehilangan langganan [11].
3. Manajemen Siklus Hidup: MVVMCross menyediakan metode siklus hidup untuk tampilan dan tampilan model, seperti `saveStateToBundle` untuk menghemat keadaan selama tombstoning, yang membantu mengelola sumber daya dan langganan selama situasi memori rendah [2]. Pengembang harus mengelola langganan secara manual selama acara siklus hidup ini untuk mencegah kebocoran.
4. Manual Despription: Di MVVMCross, pengembang disarankan untuk berhenti berlangganan secara manual dari peristiwa ketika pandangan dinonaktifkan atau dihancurkan. Ini memastikan bahwa objek berumur pendek tidak tetap direferensikan oleh objek berumur panjang, sehingga mencegah kebocoran memori [11].
Praktik terbaik
Untuk secara efektif menangani kebocoran memori di MVVMCross:
- Gunakan LREASTSubscribe: bila memungkinkan, gunakan langganan lemah untuk mencegah referensi yang kuat dari memegang objek dalam memori yang tidak perlu [10].
- Manajemen Manual: Pastikan bahwa langganan dikelola dengan benar selama view dan siklus hidup model. Berhenti berlangganan dari peristiwa ketika pandangan dinonaktifkan atau dihancurkan [11].
- Monitor Penggunaan Memori: Gunakan alat profil untuk mengidentifikasi kebocoran memori di awal pengembangan.
Dengan mengikuti strategi dan praktik terbaik ini, pengembang dapat secara efektif mengelola langganan acara dan mengurangi kebocoran memori dalam aplikasi MVVMCross.
Kutipan:[1] https://community.devexpress.com/blogs/mobile/archive/2024/11/05/net-maui-memory-profiling-icideny-and-fix-memory-leaks.aspx
[2] https://www.mvvmcross.com/documentation/fundamentals/viewmodel-lifecycle
[3.
[4] https://www.spicelogic.com/blog/net-event-handler-memory-leak-16
[5] https://www.reddit.com/r/dotnetmaui/comments/1c1qlou/maui_memory_leaks/
[6] https://www.markheath.net/post/understanding-and-avoiding-memory-leaks
[7] https://learn.microsoft.com/en-us/shows/xamarinshow/xamarin-community-toolkit-weakeventmanager-to-stop-memory-leaks
[8] https://github.com/mvvmcross/mvvmcross/issues/409
[9] https://stackoverflow.com/questions/1471064/garbage-collecting-issue-with-custom-viewbinding-in-mono-touch-and-mvvmcross?rq=1
[10] https://stackoverflow.com/questions/39315395/mvvmcross-best-way-to-raise-event-in-viewmodel
[11] https://stackoverflow.com/questions/27008035/mvvmcross-memory-leak-because-of-not-disposed-viewModels
[12] https://github.com/dotnet/maui/discussions/21918