Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Bagaimana pola peristiwa yang lemah berbeda dari peristiwa klasik di mvvmcross


Bagaimana pola peristiwa yang lemah berbeda dari peristiwa klasik di mvvmcross


Pola peristiwa yang lemah dan peristiwa klasik di MVVMCross (atau .NET Framework apa pun) melayani tujuan yang berbeda dan memiliki implementasi yang berbeda, terutama ditujukan untuk mengelola kebocoran memori dan masa hidup objek.

Acara Klasik

Acara klasik di .NET didasarkan pada referensi yang kuat. Ketika suatu objek berlangganan peristiwa objek lain, referensi yang kuat dibuat dari sumber acara ke pelanggan. Ini berarti bahwa selama sumber acara memegang referensi kepada pelanggan, pelanggan tidak dapat dikumpulkan sampah, bahkan jika itu tidak lagi diperlukan atau dirujuk di tempat lain dalam aplikasi. Hal ini dapat menyebabkan kebocoran memori jika pelanggan tidak secara eksplisit tidak berlangganan dari peristiwa tersebut ketika tidak diperlukan lagi.

Di MVVMCross, acara klasik dapat digunakan untuk komunikasi antara viewmodels dan tampilan, tetapi mereka membutuhkan manajemen yang cermat untuk menghindari kebocoran memori. Misalnya, jika ViewModel memaparkan suatu peristiwa dan tampilan berlangganan, viewmodel akan memiliki referensi yang kuat untuk tampilan, mencegahnya menjadi sampah yang dikumpulkan sampai berlangganan secara eksplisit dihapus.

Pola acara yang lemah

Pola peristiwa yang lemah dirancang untuk mencegah kebocoran memori dengan menggunakan referensi yang lemah alih -alih yang kuat. Ketika seorang pelanggan menggunakan pola peristiwa yang lemah untuk berlangganan suatu peristiwa, sumber acara memegang referensi yang lemah kepada pelanggan. Hal ini memungkinkan pelanggan untuk dikumpulkan jika tidak lagi dirujuk di tempat lain dalam aplikasi, bahkan jika itu belum secara eksplisit tidak berlangganan dari acara tersebut.

Di MVVMCross, menggunakan peristiwa lemah dapat membantu mempertahankan arsitektur yang bersih dengan memastikan bahwa viewmodels tidak memiliki referensi yang kuat untuk tampilan. Ini sangat penting dalam aplikasi seluler di mana manajemen memori sangat penting. MVVMCROSS menyediakan ekstensi seperti `LRONDSubscribe` untuk memfasilitasi penggunaan peristiwa lemah, memungkinkan pengembang untuk berlangganan peristiwa tanpa membuat referensi kuat yang dapat menyebabkan kebocoran memori.

Implementasi dan manfaat ###

Menerapkan peristiwa lemah biasanya melibatkan pembuatan mekanisme khusus untuk mengelola langganan menggunakan objek `lemah referensi`. Pendekatan ini memastikan bahwa pelanggan dapat dikumpulkan jika tidak diperlukan lagi, mengurangi risiko kebocoran memori. Namun, itu juga memperkenalkan kompleksitas tambahan dan sedikit overhead kinerja karena kebutuhan untuk memeriksa apakah pelanggan masih hidup sebelum memanggil penangan acara mereka.

kekurangan dan pertimbangan

Sementara pola peristiwa yang lemah bermanfaat untuk mencegah kebocoran memori, ia memiliki beberapa kelemahan. Ini bisa lebih kompleks untuk diterapkan daripada acara klasik, dan ada risiko objek pelanggan "zombie" yang tidak lagi digunakan tetapi belum dikumpulkan sampah. Jika suatu acara dinaikkan dan penangan pelanggan zombie dieksekusi, itu dapat menyebabkan perilaku atau kesalahan yang tidak terduga.

Singkatnya, pola peristiwa yang lemah di MVVMCross berbeda dari peristiwa klasik dengan menggunakan referensi yang lemah untuk mencegah kebocoran memori dan memungkinkan pelanggan menjadi sampah yang dikumpulkan lebih mudah. Meskipun menawarkan manfaat yang signifikan dalam hal manajemen memori, ini membutuhkan implementasi yang cermat dan pertimbangan potensi kelemahan.

Kutipan:
[1] https://stackoverflow.com/a/19379912
[2] http://stackoverflow.com/questions/30848118/capturing-the-onexit-event-in-wpf-with-mvvmcross/31784453
[3] https://www.reactiveui.net/vs/mvvmcross
[4] https://mustafacanyucel.com/blog/blog-22.html
[5] https://ladimolnar.com/2015/09/14/the-weak-event-pattern-is-dangerous/
[6] https://www.mvvmcross.com/mvvmcross-6.0.0-release/
[7] https://yanxiaodi.gitbook.io/xamarin-mvvmcross-handbook/using-mvvmcross-to-create-your-first-xamarin-app/navigation/respresspent-the-events-from-difrent-controls-in-the-listview
[8] https://www.devleader.ca/2024/02/14/weak-events-in-c-how-to-avoid-nasty-memory-leaks
[9] https://learn.microsoft.com/en-us/dotnet/desktop/wpf/events/weak-event-patterns?view=netdesktop-9.0
[10] https://www.mvmcross.com/documentation/fundamentals/navigation
[11] https://www.mvvmcross.com/documentation/fundamentals/viewmodel-lifecycle
[12] https://stackoverflow.com/questions/13788787/when-to-use-weak-events