No MVVMcross, como em outras estruturas, a escolha entre usar a referência fraca e a referência forte é crucial para gerenciar a memória e prevenir vazamentos de memória. Aqui está uma explicação detalhada das diferenças e como elas se aplicam no contexto do MVVMCROSS:
referências fortes
** Referências fortes são o tipo de referência padrão na maioria das linguagens de programação, incluindo C#. Quando um objeto é referenciado fortemente, o coletor de lixo não pode coletá -lo até que todas as referências fortes ao objeto sejam removidas. Isso significa que, enquanto houver pelo menos uma forte referência a um objeto, ele permanecerá na memória.
No MVVMcross, referências fortes podem levar a vazamentos de memória se não forem gerenciados corretamente. Por exemplo, se um ViewModel mantém uma forte referência a uma visualização e a visualização também mantém uma forte referência ao ViewModel, um ciclo de retenção será criado. Isso impede que ambos os objetos sejam coletados de lixo, mesmo quando não são mais necessários.
Referências fracas
** Referências fracas, por outro lado, permitem que o coletor de lixo colete o objeto referenciado se não houver referências fortes. Isso é particularmente útil em cenários em que você deseja permitir que um objeto seja coletado de lixo se não for mais necessário, mas ainda quiser acessá -lo se estiver disponível.
No MVVMcross, o uso de referências fracas é incentivado a evitar os ciclos de reter os modelos e vistas. Por exemplo, em vez de fazer um viewmodel referenciar fortemente uma visão, você pode usar uma referência fraca ou um sistema de mensagens para se comunicar entre eles. Isso garante que a visão possa ser coletada de lixo quando não for mais necessária, mesmo que o viewmodel ainda exista.
Exemplo prático em mvvmcross
Considere um cenário em que um viewmodel precisa notificar uma visualização quando alguns dados são carregados. Uma abordagem comum é usar um evento no ViewModel ao qual a visualização assina. No entanto, se a visualização se inscrever fortemente a este evento, cria uma forte referência do ViewModel de volta à vista, o que pode impedir que a visão seja coletada de lixo.
Para evitar isso, o MVVMCROSS fornece métodos como o `FrawSubscribe`, que permite que a vista se inscreva nos eventos do ViewModel fracamente. Dessa forma, o ViewModel não possui uma forte referência à visão, impedindo vazamentos de memória.
Diretrizespara usar referências fracas em mvvmcross
- Use referências fracas para visões: quando um viewmodel precisar interagir com uma visão, use referências fracas ou sistemas de mensagens para evitar os ciclos de reter.
- Evite referências fortes às visões: verifique se o ViewModels não mantém referências fortes às visões para permitir que as visões sejam coletadas de lixo quando não forem mais necessárias.
- Use sistemas de mensagens: considere o uso de sistemas de mensagens como o `imvxMessenger` da MVVMcross para se comunicar entre ViewModels e Views sem criar referências fortes.
Seguindo essas diretrizes, você pode gerenciar efetivamente a memória em aplicativos MVVMCROSS e evitar problemas comuns como vazamentos de memória.
Citações:[1] https://stackoverflow.com/a/19379912
[2] https://forums.swift.org/t/unowned-references-have-more-overhead-than-strong-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_mvm_browening_retainer_cycle_between/
[5] https://stackoverflow.com/questions/40966271/weak-reference-and-strong-reference
[6] https://langdev.stackexchange.com/questions/1351/aproaches-for-implementing-weak-references
[7] https://putridparrot.com/blog/weakreferences-in-nnet/
[8] http://java-latte.blogspot.com/2014/07/difference-between-strongreference-weakreference-shoftreference-hantomreference-in-java.html