Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Como o MVVMcross garante a coleta de lixo para assinaturas de eventos


Como o MVVMcross garante a coleta de lixo para assinaturas de eventos


O MVVMcross garante a coleta de lixo para assinaturas de eventos principalmente através do uso de referências fracas. Aqui está uma explicação detalhada de como funciona:

Visão geral do MVVMCross Messenger

O plug -in MVVMCross Messenger foi projetado para facilitar a agregação de eventos entre os componentes. Ele permite que os componentes se comuniquem publicando e assinando mensagens. O Messenger usa referências fracas para assinaturas de eventos, o que ajuda a evitar vazamentos de memória, permitindo que o coletor de lixo remova os objetos que não são mais referenciados.

Referências fracas em mvvmcross

Quando você assina uma mensagem usando o MVVMCross Messenger, pode especificar se deve usar uma referência fraca ou forte. Por padrão, o MVVMcross usa referências fracas (`mvxReference.weak`) para assinaturas. Isso significa que o Mensageiro não possui uma forte referência ao método de retorno de chamada, permitindo que o coletor de lixo remova a assinatura se o objeto que assinou sair do escopo.

assinatura e cancelamento de inscrição

As assinaturas podem ser gerenciadas usando vários métodos:
- Inscreva -se: as mensagens são passadas diretamente no tópico de publicação.
- SubscribeonMainthread: As mensagens são organizadas no thread principal da interface do usuário.
- SubscribeOnthreadPoolThread: As mensagens são filmadas para o processamento do pool de threads.

Cada método de assinatura retorna um `mvxSubScriptionToken`, que pode ser usado para cancelar a inscrição da mensagem. No entanto, se o token não for armazenado, a assinatura poderá ser coletada de lixo imediatamente.

mecanismo de coleta de lixo

O mecanismo de coleta de lixo em MVVMcross depende do `MVXSubScriptionToken`, sendo o lixo coletado quando ele sai do escopo. Se um token de assinatura não for armazenado, ele será elegível para a coleta de lixo, o que pode levar à caça à inscrição do manipulador de eventos. Essa abordagem garante que os objetos não sejam mantidos na memória desnecessariamente devido a assinaturas de eventos.

observando o status de assinatura

O MVVMCROSS também fornece métodos para observar o status atual da assinatura, como 'Hassubscriptionsfor' e `CountSubscriptionsfortionsfor. Além disso, o Messenger publica as mensagens `mvxSubScriberChangeMessage` sempre que as assinaturas são adicionadas, removidas ou expirarem, permitindo que os componentes adaptem seu comportamento com base no estado de assinatura atual.

práticas recomendadas para gerenciamento de memória

Para garantir uma coleta eficaz de lixo e impedir vazamentos de memória:
- Use referências fracas para assinaturas de eventos sempre que possível.
- Armazene os tokens de assinatura se precisar gerenciar assinaturas explicitamente.
- Cancelar a inscrição de eventos quando não são mais necessários, especialmente se estiver usando referências fortes.
- Evite manter fortes referências a objetos que devem ser coletados de lixo, como modelos de exibição ou vistas.

Seguindo essas práticas e alavancando o mecanismo fraco de assinatura da MVVMCROSS, os desenvolvedores podem ajudar a garantir que as assinaturas de eventos não impedam que os objetos sejam coletados de lixo, mantendo assim o gerenciamento de memória eficiente em suas aplicações.

Citações:
[1] https://www.mvvmcross.com/documentation/plugins/messenger
[2] https://stackoverflow.com/questions/39315395/mvvmcross-best-way-to-raise-event-in-viewmodel
[3] https://stackoverflow.com/questions/12494804/helping-the-gc-in-mono-droid-using-mvvmcross
[4] https://gregshackles.com/weak-subscription-gutcha-in-mvvmcross/
[5] https://github.com/mvvmcross/mvvmcross/issues/2145
[6] https://livebook.manning.com/book/xamarin-in-action/b-using-mvvm-light-instead-of-mvvmcross/v-15/
[7] https://stackoverflow.com/questions/30798429/mvvmcross-android-viewmodel-never-Garbage Collegte
[8] https://www.mvvmcross.com/documentation/advanced/customizing-using-app-and-setup
[9] https://www.spiceLogic.com/blog/net-event-handler-memory-leak-16