Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Quali sono le differenze tra l'uso di deboli e la forte referenza in mvvmcross


Quali sono le differenze tra l'uso di deboli e la forte referenza in mvvmcross


In mvvmcross, come in altri framework, la scelta tra l'utilizzo di debolezza e forte reference è cruciale per la gestione della memoria e la prevenzione delle perdite di memoria. Ecco una spiegazione dettagliata delle differenze e di come si applicano nel contesto di mvvmcross:

Riferimenti forti

** I riferimenti forti sono il tipo di riferimento predefinito nella maggior parte dei linguaggi di programmazione, incluso C#. Quando un oggetto viene fortemente referenziato, il collezionista di immondizia non può raccoglierlo fino a quando non vengono rimossi tutti i riferimenti forti all'oggetto. Ciò significa che fintanto che esiste almeno un forte riferimento a un oggetto, rimarrà in memoria.

In MVVMCRoss, riferimenti forti possono portare a perdite di memoria se non gestite correttamente. Ad esempio, se una ViewModel ha un forte riferimento a una vista e la vista contiene anche un forte riferimento al ViewModel, viene creato un ciclo di mantenimento. Ciò impedisce a entrambi gli oggetti di essere raccolti nella spazzatura anche quando non sono più necessari.

Riferimenti deboli

** Riferimenti deboli, d'altra parte, consentire al collezionista di immondizia di raccogliere l'oggetto referenziato se non esistono riferimenti forti. Ciò è particolarmente utile negli scenari in cui si desidera consentire a un oggetto di essere raccolto dalla spazzatura se non è più necessario, ma si desidera comunque accedervi se sembra essere disponibile.

In MVVMCRoss, l'uso di riferimenti deboli è incoraggiato a evitare i cicli di consumo tra ViewModels e viste. Ad esempio, invece di avere una ViewModel fare riferimento fortemente a una vista, è possibile utilizzare un riferimento debole o un sistema di messaggistica per comunicare tra loro. Ciò garantisce che la vista possa essere raccolta immondizia quando non è più necessaria, anche se esiste ancora il punto di vista.

Esempio pratico in mvvmcross

Prendi in considerazione uno scenario in cui una ViewModel deve avvisare una vista quando vengono caricati alcuni dati. Un approccio comune è quello di utilizzare un evento nel ViewModel a cui si iscrive la vista. Tuttavia, se la vista si iscrive fortemente a questo evento, crea un forte riferimento da ViewModel alla vista, che può impedire che la vista sia raccolta.

Per evitare questo, MVVMCROSS fornisce metodi come "DIBLESUSCRIZIONE", che consente alla vista di iscriversi debolmente agli eventi di ViewModel. In questo modo, ViewModel non ha un forte riferimento alla vista, impedendo le perdite di memoria.

linee guida per l'utilizzo di riferimenti deboli in mvvmcross

- Utilizzare riferimenti deboli per le visualizzazioni: quando una ViewModel deve interagire con una vista, utilizzare riferimenti deboli o sistemi di messaggistica per evitare di trattenere i cicli.
- Evita riferimenti forti alle opinioni: assicurarsi che ViewModels non mantengano forti riferimenti alle opinioni per consentire la raccolta della spazzatura quando non sono più necessarie.
- Utilizzare sistemi di messaggistica: prendi in considerazione l'uso di sistemi di messaggistica come l'IMVXMessenger` di MVVMCROSS per comunicare tra ViewModels e viste senza creare riferimenti forti.

Seguendo queste linee guida, è possibile gestire efficacemente la memoria nelle applicazioni MVVMCRoss e prevenire problemi comuni come perdite di memoria.

Citazioni:
[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-conllection/weak-references
[4] https://www.reddit.com/r/swift/comments/8ifwy9/ios_mvvm_breaking_retainer_cycle_between/
[5] https://stackoverflow.com/questions/40966271/weak-reference-and-strong-reference
[6] https://langdev.stackexchange.com/questions/1351/appeaches-for-implementing-weak-references
[7] https://puttridparrot.com/blog/weakreferences-in-net/
[8] http://java-latte.blogspot.com/2014/07/difference-between-strongreferencefereference-weakreference-oftreference-phantomreference-in-java.html