MVVMCrossin (tai minkä tahansa .NET -kehyksen) heikko tapahtumakuvio ja klassiset tapahtumat palvelevat erilaisia tarkoituksia ja niillä on selkeät toteutukset, joiden tarkoituksena on ensisijaisesti hallita muistivuotoja ja esineitä.
Klassiset tapahtumat
.NET: n klassiset tapahtumat perustuvat vahvoihin viitteisiin. Kun objekti merkitsee toisen objektin tapahtuman, tapahtuman lähteestä luodaan vahva referenssi tilaajalle. Tämä tarkoittaa, että niin kauan kuin tapahtuman lähde viittaa tilaajaan, tilaajaa ei voida kerätä, vaikka sitä ei enää tarvita tai viitataan muualla hakemuksessa. Tämä voi johtaa muistivuotoihin, jos tilaajaa ei ole nimenomaisesti perimättä tapahtumasta, kun sitä ei enää tarvita.
MVVMCrossissa klassisia tapahtumia voidaan käyttää viestinnässä näkymämallien ja näkymien välillä, mutta ne vaativat huolellista hallintaa muistivuotojen välttämiseksi. Esimerkiksi, jos ViewModel paljastaa tapahtuman ja näkymä siihen tilaa, ViewModel pitää voimakkaan viittauksen näkymään, estäen sen kerättyjä jätteitä, kunnes tilaus on nimenomaisesti poistettu.
Heikko tapahtumakuvio
Heikko tapahtumamalli on suunniteltu estämään muistivuodot käyttämällä heikkoja viitteitä vahvojen sijaan. Kun tilaaja käyttää heikkoa tapahtumakuviota tapahtuman tilaamiseen, tapahtuman lähteellä on heikko viittaus tilaajaan. Tämä mahdollistaa tilaajan keräämisen, jos siihen ei enää viitata muualla hakemuksessa, vaikka se ei olisi nimenomaisesti määrittänyt tapahtumasta.
MVVMCrossissa heikkojen tapahtumien käyttäminen voi auttaa ylläpitämään puhtaan arkkitehtuurin varmistamalla, että ViewModels ei pidä vahvoja viittauksia näkymiin. Tämä on erityisen tärkeää mobiilisovelluksissa, joissa muistin hallinta on kriittistä. MVVMCROSS tarjoaa laajennuksia, kuten "heikkenevät tilaus" helpottaa heikkojen tapahtumien käyttöä, jolloin kehittäjät voivat tilata tapahtumia luomatta vahvoja viitteitä, jotka voivat johtaa muistivuotoihin.
Toteutus ja edut
Heikkojen tapahtumien toteuttamiseen sisältyy tyypillisesti räätälöityjen mekanismien luominen tilausten hallitsemiseksi "heikkojenReference" -objektien avulla. Tämä lähestymistapa varmistaa, että tilaajat voidaan kerätä roskia, jos niitä ei enää tarvita, mikä vähentää muistivaaraa. Se esittelee kuitenkin myös ylimääräistä monimutkaisuutta ja lievää suorituskyvyn yleiskustannuksia, koska tarve tarkistaa, ovatko tilaajat edelleen elossa ennen kuin soittavat tapahtumankäsittelijänsä.
haitat ja näkökohdat
Vaikka heikko tapahtumamalli on hyödyllinen muistivuotojen estämisessä, sillä on joitain haittoja. Se voi olla monimutkaisempi toteuttaa kuin klassisia tapahtumia, ja "zombie" -tilaajien objektien riski, jota ei enää käytetä, mutta joita ei ole vielä kerätty roskaa. Jos tapahtuma nostetaan ja zombie -tilaajan käsittelijä toteutetaan, se voi johtaa odottamattomaan käyttäytymiseen tai virheisiin.
Yhteenvetona voidaan todeta, että MVVMCrossin heikko tapahtumamalli eroaa klassisista tapahtumista käyttämällä heikkoja viitteitä muistivuotojen estämiseksi ja tilaajien sallimiseksi helpommin kerättyjä roskia. Vaikka se tarjoaa merkittäviä etuja muistinhallinnassa, se vaatii huolellista toteutusta ja mahdollisten haittojen huomioon ottamista.
Viittaukset:[1] https://stackoverflow.com/a/19379912
.
[3] https://www.reactiveui.net/vs/mvvmcross
[4] https://mustafacanyucel.com/blog/blog-22.html
.
[6] https://www.mvvmcross.com/mvvmcross-6.0.0-release/
.
[8] https://www.devleader.ca/2024/02/14/weak-events-in-c-how-to-avoid-nasty-memory-leaks
[9.
[10] https://www.mvvmcross.com/documentation/fundamentals/navigation
[11] https://www.mvvmcross.com/documentation/fundamentals/viewModel-lifecycle
[12] https://stackoverflow.com/questions/13788787/when-to-use-weak-vents