MVVMCross, öncelikle zayıf referanslar kullanarak olay abonelikleri için çöp toplama sağlar. İşte nasıl çalıştığına dair ayrıntılı bir açıklama:
MVVMCross Messenger'a Genel Bakış
MVVMCross Messenger eklentisi, bileşenler arasındaki olay toplamasını kolaylaştırmak için tasarlanmıştır. Bileşenlerin mesajları yayınlayarak ve abone olarak iletişim kurmasına izin verir. Messenger, olay abonelikleri için zayıf referanslar kullanır, bu da çöp toplayıcının artık referanslanmayan nesneleri kaldırmasına izin vererek bellek sızıntılarını önlemeye yardımcı olur.
mvvmcross'ta zayıf referanslar
MVVMCross Messenger'ı kullanarak bir mesaja abone olduğunuzda, zayıf veya güçlü bir referans kullanıp kullanmayacağınızı belirtebilirsiniz. Varsayılan olarak, MVVMCross abonelikler için zayıf referanslar (`mvxreference.weak`) kullanır. Bu, habercinin geri arama yöntemine güçlü bir referans almadığı ve abone olan nesne kapsamın dışına çıkarsa çöp toplayıcının aboneliği kaldırmasına izin verdiği anlamına gelir.
Abonelik ve abonelik
Abonelikler çeşitli yöntemler kullanılarak yönetilebilir:
- Abone Olun: Mesajlar doğrudan Yayıncılık Konuya Aktarılır.
- aboneonmainthread: Mesajlar ana kullanıcı arayüzüne maruz kalır.
- abone dehreadpoolthread: İplik havuzu işleme için mesajlar sıraya alınır.
Her abonelik yöntemi, mesajın aboneliğini iptal etmek için kullanılabilen bir `mvxsubscriptionToken 'döndürür. Ancak, jeton depolanmazsa, abonelik derhal çöp toplanabilir.
Çöp toplama mekanizması
MVVMCross'taki çöp toplama mekanizması, kapsamın dışına çıktığında çöp toplanan `` mvxsubscriptionToken '' e dayanmaktadır. Bir abonelik jetonu saklanmazsa, etkinlik işleyicisinin aboneliğine yol açabilecek çöp toplama için uygun olacaktır. Bu yaklaşım, nesnelerin olay abonelikleri nedeniyle gereksiz yere bellekte tutulmamasını sağlar.
abonelik durumunu gözlemleme
MVVMCross ayrıca `` HassubScriptionsfor '' ve `soundsubScriptionsfor 'gibi geçerli abonelik durumunu gözlemlemek için yöntemler sağlar. Ek olarak, Messenger, abonelikler eklendiğinde, kaldırıldığında veya süresi dolduğunda, bileşenlerin geçerli abonelik durumuna göre davranışlarını uyarlamasına izin veren `mvxsubscriberChangemessage` mesajları yayınlar.
Bellek Yönetimi için En İyi Uygulamalar
Etkili çöp toplanmasını sağlamak ve bellek sızıntılarını önlemek için:
- Mümkün olduğunca olay abonelikleri için zayıf referanslar kullanın.
- Abonelikleri açıkça yönetmeniz gerekiyorsa abonelik jetonlarını saklayın.
- Özellikle güçlü referanslar kullanıyorlarsa, artık ihtiyaç duyulmadıklarında olaylardan abonelikten çıkın.
- Görünüm modelleri veya görünümleri gibi çöp toplanması gereken nesnelere güçlü referanslar tutmaktan kaçının.
Bu uygulamaları takip ederek ve MVVMCross'un zayıf abonelik mekanizmasını kullanarak, geliştiriciler olay aboneliklerinin nesnelerin çöp toplanmasını engellememesini sağlayarak uygulamalarında verimli bellek yönetimini sürdürmeye yardımcı olabilir.
Alıntılar:[1] https://www.mvvmcross.com/documentation/plugins/messenger
[2] https://stackoverflow.com/questions/39315395/mvvmcross-best-to-raise-event-in-viewmodel
[3] https://stackoverflow.com/questions/12494804/helping-the-the-gc-in-mono-droid-ususing-mvvmcross
[4] https://gregshackles.com/weak-bscription-gotcha-in-mvvmcross/
[5] https://github.com/mvvmcross/mvvmcross/issues/2145
[6] https://livebook.manning.com/book/xamarin-incaction/b-using-mvvm-light-instead-of-mvmcross/v-15/
[7] https://stackoverflow.com/questions/30798429/mvvmcross-android-viewmodel-never-garbage-colted
[8] https://www.mvvmcross.com/documentation/adved/customizizing-using-app-and-setup
[9] https://www.spicelogic.com/blog/net-event-handler-memory-leak-16