Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Kokie yra skirtumai tarp silpnosios nukreipimo ir stipriosios nuorodos naudojimo mvvmcross


Kokie yra skirtumai tarp silpnosios nukreipimo ir stipriosios nuorodos naudojimo mvvmcross


MVVMCROSS, kaip ir kitose sistemose, pasirinkimas tarp silpnosios versijos ir stipriosios nuorodos yra labai svarbus norint valdyti atmintį ir užkirsti kelią atminties nutekėjimui. Čia pateiktas išsamus skirtumų paaiškinimas ir tai, kaip jie taikomi MVVMCross kontekste:

Stiprios nuorodos

** Stiprios nuorodos yra numatytasis nuorodų tipas daugelyje programavimo kalbų, įskaitant C#. Kai objektas yra tvirtai nurodytas, šiukšlių surinkėjas negali jo surinkti, kol nebus pašalintos visos tvirtos nuorodos į objektą. Tai reiškia, kad tol, kol yra bent viena tvirta nuoroda į objektą, jis liks atmintyje.

MVVMCross, stiprios nuorodos gali sukelti atminties nutekėjimą, jei ji nebus tinkamai valdoma. Pvz., Jei „ViewModel“ turi tvirtą nuorodą į vaizdą, o vaizdas taip pat turi tvirtą nuorodą į „ViewModel“, sukuriamas išlaikymo ciklas. Tai neleidžia abiems objektams surinkti šiukšles net tada, kai jų nebereikia.

Silpnos nuorodos

** Silpnos nuorodos, kita vertus, leidžia šiukšlių rinkėjui surinkti nurodytą objektą, jei nėra stiprių nuorodų. Tai ypač naudinga scenarijuose, kuriuose norite leisti, kad objektas būtų surinktas šiukšlėmis, jei jo nebereikia, tačiau vis tiek norite jį pasiekti, jei jis yra prieinamas.

MVVMCROSS, naudojant silpną nuorodą, skatinama išvengti laikymo ciklų tarp vaizdo modelių ir vaizdų. Pvz., Užuot turėję „ViewModel“ tvirtai nurodant vaizdą, galite naudoti silpną nuorodą arba pranešimų sistemą, kad galėtumėte bendrauti. Tai užtikrina, kad vaizdas gali būti surinktas šiukšlėmis, kai jo nebereikia, net jei „ViewModel“ vis dar egzistuoja.

praktinis pavyzdys MVVMCross

Apsvarstykite scenarijų, kai „ViewModel“ turi pranešti apie vaizdą, kai įkeliami kai kurie duomenys. Įprastas požiūris yra naudoti įvykį „ViewModel“, kurį užsiprenumeruoja vaizdas. Tačiau jei vaizdas labai užsiprenumeruoja šį įvykį, jis sukuria stiprią nuorodą iš „ViewModel“ atgal į vaizdą, kuris gali užkirsti kelią vaizdui surinkti šiukšles.

Norėdami to išvengti, „MVVMCross“ pateikia tokius metodus kaip „WearSubscribe“, kurie leidžia vaizdui silpnai užsiprenumeruoti „ViewModel“ įvykius. Tokiu būdu „ViewModel“ neturi tvirtos nuorodos į vaizdą, užkirsdamas kelią atminties nutekėjimui.

Silpnų nuorodų naudojimo MVVMCross gairėse

- Naudokite silpnąsias nuorodas vaizdams: Kai „ViewModel“ turi sąveikauti su vaizdu, naudokite silpnas nuorodas ar pranešimų siuntimo sistemas, kad išvengtumėte išlaikymo ciklų.
- Venkite tvirtų nuorodų į vaizdus: įsitikinkite, kad „ViewModels“ neturi tvirtų nuorodų į vaizdus, ​​kad vaizdai būtų surinkti šiukšles, kai jų nebereikia.
- Naudokite pranešimų siuntimo sistemas: apsvarstykite galimybę naudotis žinučių siuntimo sistemomis, tokiomis kaip „Mvvmcross“ „imvxmessenger“, kad galėtumėte bendrauti tarp „ViewModels“ ir „Views“, nesukuriant stiprių nuorodų.

Vykdydami šias gaires, galite veiksmingai valdyti atmintį „MVVMCross“ programose ir užkirsti kelią bendroms problemoms, tokioms kaip atminties nutekėjimas.

Citatos:
[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
]
[5] https://stackoverflow.com/questions/40966271/weak-reference-and-strong-reference
[6] https://langdev.stackexchange.com/questions/1351/apleaproaches-for-implementting-weak-references
[7] https://putridparrot.com/blog/weakreferences-in-net/
[8] http://java-latte.blogspot.com/2014/07/difference-between-strongreference-weakreference-softreference-fantomreference-in-java.html