În MVVMcross, ca și în alte cadre, alegerea dintre utilizarea referinței slabe și strongreferență este crucială pentru gestionarea memoriei și prevenirea scurgerilor de memorie. Iată o explicație detaliată a diferențelor și a modului în care acestea se aplică în contextul MVVMcross:
Referințe puternice
** Referințele puternice sunt tipul implicit de referință în majoritatea limbajelor de programare, inclusiv C#. Când un obiect este menționat puternic, colectorul de gunoi nu îl poate colecta până când nu sunt eliminate toate referințele puternice la obiect. Aceasta înseamnă că atâta timp cât există cel puțin o referire puternică la un obiect, va rămâne în memorie.
În MVVMcross, referințele puternice pot duce la scurgeri de memorie dacă nu sunt gestionate corect. De exemplu, dacă un ViewModel ține o referire puternică la o vedere, iar vizualizarea ține și o referință puternică la ViewModel, se creează un ciclu de reținere. Acest lucru împiedică ambele obiecte să fie colectate gunoiul chiar și atunci când nu mai sunt necesare.
Referințe slabe
** Referințele slabe, pe de altă parte, permit colectorului de gunoi să colecteze obiectul la care se face referire dacă nu există referințe puternice. Acest lucru este util în special în scenariile în care doriți să permiteți colectarea gunoiului, dacă nu mai este necesar, dar totuși doriți să îl accesați dacă se întâmplă să fie disponibil.
În MVVMcross, utilizarea referințelor slabe este încurajată pentru a evita reținerea ciclurilor între ViewModels și vizualizări. De exemplu, în loc să aveți un ViewModel de referință puternic la o vedere, puteți utiliza o referință slabă sau un sistem de mesagerie pentru a comunica între ele. Acest lucru asigură că viziunea poate fi colectată de gunoi atunci când nu mai este nevoie, chiar dacă ViewModel mai există.
Exemplu practic în mvvmcross
Luați în considerare un scenariu în care un ViewModel trebuie să notifice o vizualizare atunci când unele date sunt încărcate. O abordare comună este utilizarea unui eveniment în ViewModel la care se abonează vizualizarea. Cu toate acestea, dacă vizualizarea se abonează puternic la acest eveniment, creează o referință puternică de la ViewModel înapoi la vedere, ceea ce poate împiedica colectarea gunoiului.
Pentru a evita acest lucru, MVVMcross oferă metode precum „Slabsubscribe”, care permite vizualizarea să se aboneze slab la evenimentele ViewModel. În acest fel, ViewModel nu ține o referire puternică la vizualizare, împiedicând scurgerile de memorie.
Orientări pentru utilizarea referințelor slabe în MVVMcross
- Utilizați referințe slabe pentru vizualizări: Când un ViewModel trebuie să interacționeze cu o vedere, utilizați referințe slabe sau sisteme de mesagerie pentru a evita ciclurile de reținere.
- Evitați referințe puternice la vizualizări: Asigurați -vă că ViewModels nu păstrează referințe puternice la vizualizări pentru a permite colectarea gunoiului atunci când nu mai sunt necesare.
- Utilizați sisteme de mesagerie: Luați în considerare utilizarea sistemelor de mesagerie precum „IMVXMessenger” de MVVMCross pentru a comunica între ViewModels și vizualizări fără a crea referințe puternice.
Urmând aceste orientări, puteți gestiona eficient memoria în aplicațiile MVVMcross și puteți preveni probleme comune precum scurgerile de memorie.
Citări:[1] https://stackoverflow.com/a/19379912
[2] https://forums.swift.org/t/UNOWNED-REFERENCENS-HAVE-MORE-OVERHEAD-THAN-STRONG-REFERINȚE/72765
[3] https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/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-srong-reference
[6] https://langdev.stackexchange.com/questions/1351/approaches-for-implementing-weak-references
[7] https://putridparrot.com/blog/weakreference-in-net/
[8] http://java-latte.blogspot.com/2014/07/diffence-between-strongreference-weakreference-softreference-phantomreference-in-java.html