Dalam MVVMCross, seperti dalam kerangka kerja lainnya, pilihan antara menggunakan refreferensi lemah dan StrongReference sangat penting untuk mengelola memori dan mencegah kebocoran memori. Berikut penjelasan terperinci tentang perbedaan dan bagaimana mereka berlaku dalam konteks MVVMCross:
Referensi yang kuat
** Referensi yang kuat adalah jenis referensi default di sebagian besar bahasa pemrograman, termasuk C#. Ketika suatu objek dirujuk dengan kuat, pengumpul sampah tidak dapat mengumpulkannya sampai semua referensi yang kuat untuk objek dihapus. Ini berarti bahwa selama setidaknya ada satu referensi yang kuat untuk suatu objek, itu akan tetap dalam memori.
Dalam MVVMCross, referensi yang kuat dapat menyebabkan kebocoran memori jika tidak dikelola dengan benar. Misalnya, jika viewmodel memiliki referensi yang kuat untuk tampilan, dan tampilan juga memiliki referensi yang kuat untuk ViewModel, siklus penahan dibuat. Ini mencegah kedua objek menjadi sampah dikumpulkan bahkan ketika mereka tidak lagi diperlukan.
Referensi yang lemah
** Referensi yang lemah, di sisi lain, memungkinkan pengumpul sampah untuk mengumpulkan objek yang direferensikan jika tidak ada referensi yang kuat. Ini sangat berguna dalam skenario di mana Anda ingin mengizinkan suatu objek dikumpulkan jika tidak diperlukan lagi, tetapi masih ingin mengaksesnya jika kebetulan tersedia.
Di MVVMCross, menggunakan referensi yang lemah didorong untuk menghindari siklus mempertahankan antara viewmodels dan views. Misalnya, alih -alih memiliki viewmodel sangat merujuk tampilan, Anda dapat menggunakan referensi yang lemah atau sistem pesan untuk berkomunikasi di antara mereka. Ini memastikan bahwa tampilan dapat dikumpulkan ketika tidak diperlukan lagi, bahkan jika viewmodel masih ada.
Contoh praktis di mvvmcross
Pertimbangkan skenario di mana ViewModel perlu memberi tahu tampilan ketika beberapa data dimuat. Pendekatan umum adalah menggunakan suatu peristiwa di viewmodel yang dilanggar oleh tampilan. Namun, jika tampilan berlangganan kuat ke acara ini, itu menciptakan referensi yang kuat dari viewmodel kembali ke tampilan, yang dapat mencegah pandangan dari sampah dikumpulkan.
Untuk menghindari hal ini, MVVMCross menyediakan metode seperti `LovSubscribe`, yang memungkinkan tampilan untuk berlangganan peristiwa ViewModel dengan lemah. Dengan cara ini, ViewModel tidak memiliki referensi yang kuat untuk tampilan, mencegah kebocoran memori.
Pedomanuntuk menggunakan referensi lemah di MVVMCross
- Gunakan referensi yang lemah untuk tampilan: Ketika viewmodel perlu berinteraksi dengan tampilan, gunakan referensi yang lemah atau sistem pesan untuk menghindari siklus mempertahankan.
- Hindari referensi yang kuat untuk tampilan: Pastikan viewmodels tidak memiliki referensi yang kuat untuk tampilan untuk memungkinkan tampilan menjadi sampah yang dikumpulkan ketika mereka tidak lagi diperlukan.
- Gunakan Sistem Pesan: Pertimbangkan menggunakan sistem pesan seperti `imvxmessenger` dari MVVMCross untuk berkomunikasi antara viewmodels dan tampilan tanpa membuat referensi yang kuat.
Dengan mengikuti pedoman ini, Anda dapat secara efektif mengelola memori dalam aplikasi MVVMCross dan mencegah masalah umum seperti kebocoran memori.
Kutipan:[1] https://stackoverflow.com/a/19379912
[2] https://forums.swift.org/t/unowned-references-have-more-overhead-than-stong-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_retailer_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-litte.blogspot.com/2014/07/difference-between-stegreference-weakreference-toftreference-phantomreference-in-java.html