Az MVVMCross -ban, mint más keretekhez hasonlóan, a memória kezelése és a memória szivárgásainak megelőzéséhez elengedhetetlen a választás a gyengeség és az erős referencia használata között. Íme egy részletes magyarázat a különbségekről és arról, hogy miként alkalmazhatók az MVVMCross összefüggésében:
Erős referenciák
** Az erős referenciák az alapértelmezett referencia típusa a legtöbb programozási nyelven, beleértve a C#-et. Ha egy objektumot erősen hivatkoznak, a hulladékgyűjtő nem tudja összegyűjteni, amíg az objektumra való összes erős hivatkozást eltávolítják. Ez azt jelenti, hogy mindaddig, amíg legalább egy erős hivatkozás van egy objektumra, a memóriában marad.
Az MVVMCross -ban az erős referenciák memóriaszivárgáshoz vezethetnek, ha nem megfelelően kezelik. Például, ha egy ViewModel erőteljesen hivatkozik a nézetre, és a nézet erősen hivatkozik a ViewModelre is, akkor megtartja a ciklust. Ez megakadályozza, hogy mindkét objektum a szemét összegyűjtésében, még akkor is, ha már nincs rá szükség.
gyenge referenciák
** A gyenge referenciák viszont lehetővé teszik, hogy a szemétgyűjtő összegyűjtse a hivatkozott objektumot, ha nem léteznek erős hivatkozások. Ez különösen akkor hasznos a forgatókönyvekben, amikor megengedi, hogy egy tárgyat összegyűjtsenek, ha erre már nincs rá szükség, de mégis hozzáférni szeretne, ha ez elérhető.
Az MVVMCross -ban a gyenge referenciák használatát arra ösztönzik, hogy elkerüljék a nézetModelek és a nézetek közötti ciklusok megtartását. Például, ahelyett, hogy a ViewModel erősen hivatkozna egy nézetre, használhat egy gyenge referenciát vagy üzenetküldő rendszert a kommunikációhoz. Ez biztosítja, hogy a nézet szemétgyűjtéssel összegyűjtse, amikor már nincs rá szükség, még akkor is, ha a ViewModel még mindig létezik.
Gyakorlati példa az mvvmcross -ban
Vegye figyelembe azt a forgatókönyvet, amikor a ViewModelnek értesítenie kell a nézetet, amikor egyes adatok betöltődnek. Általános megközelítés egy olyan esemény használata, amelyben a ViewModelben a nézet előfizet. Ha azonban a nézet erőteljesen feliratkozik erre az eseményre, akkor erős hivatkozást hoz létre a ViewModel -ből a Vissza a nézetbe, amely megakadályozhatja a nézet összegyűjtését.
Ennek elkerülése érdekében az MVVMCross olyan módszereket biztosít, mint a `gyenge szubscriface", amely lehetővé teszi a nézet számára, hogy gyengén feliratkozzon a ViewModel eseményeire. Ilyen módon a ViewModel nem rendelkezik erősen a nézetre, megakadályozva a memória szivárgását.
Útmutatások a gyenge referenciák használatához az mvvmcross -ban
- Használjon gyenge referenciákat a nézetekhez: Ha a ViewModelnek kölcsönhatásba kell lépnie egy nézettel, használjon gyenge referenciákat vagy üzenetküldő rendszereket a ciklusok megtartása érdekében.
- Kerülje el a nézetekre vonatkozó erős hivatkozásokat: Gondoskodjon arról, hogy a ViewModels ne tartson erős utalásokat a nézetekre, hogy lehetővé tegyék a nézeteket, hogy összegyűjtsék a szemetet, amikor már nincs szükségük rá.
- Használjon üzenetküldő rendszereket: Fontolja meg az üzenetküldő rendszerek használatát, mint például az MVVMCross „IMVXMessenger”, hogy kommunikáljon a ViewModels és a Views között, erős hivatkozások létrehozása nélkül.
Ezen iránymutatások betartásával hatékonyan kezelheti a memóriát az MVVMCross alkalmazásokban, és megakadályozhatja a közös kérdéseket, például a memória szivárgásait.
Idézetek:[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_breaking_retainer_cycle_between/
[5] https://stackoverflow.com/questions/40966271/weak-reference-and-strong-reference
[6] https://langdev.stackexchange.com/questions/1351/approaches-for-implementing-weak-references
[7] https://putridparrot.com/blog/weakreferences-in-net/
[8] http://java-latte.blogspot.com/2014/07/difference-betweenreference-weakreference-preference-phantomreference-in-java.html