Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon MVVMCross olay abonelikleri için çöp toplama nasıl sağlar?


MVVMCross olay abonelikleri için çöp toplama nasıl sağlar?


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