Domanda

Sto lavorando su un'app Silverlight usando il modello MVVM. My ViewModel attualmente è costituito da una proprietà che rappresenta una raccolta di oggetti modello:

public ObservableCollection<IndexEntry> IndexList
        {
            get;
            set;
        }

ha anche diversi metodi che popoleranno quella raccolta con dati che ritornano da un servizio web.

Poiché le istanze di questa classe possono essere create e distrutte nel corso del runtime dell'applicazione, devo implementare IDisposable e impostare il riferimento della proprietà su null o la distruzione di questa classe sarà sufficiente per rimuovere tutti i riferimenti alla raccolta questa proprietà si riferisce a? Ci sono avvertenze che potrebbero lasciare un riferimento in giro?

Grazie.

È stato utile?

Soluzione

L'unico modo in cui un riferimento sopravvive alla raccolta dei rifiuti è se è rootato. Se è ancora in uso un'altra classe che contiene un riferimento a ObservableCollection, allora ObservableCollection non verrà distrutto, indipendentemente dal fatto che sia stato impostato su null. Ad esempio, supponiamo che esista un oggetto "in memoria" che è la tua raccolta. Hai un riferimento ad esso, nella tua proprietà. Qualche altro codice esegue la riga & Quot; ObservableCollection & Lt; & Gt; myOtherReference = YourObject.IndexList; " ;. Ora hanno anche un riferimento all'oggetto di memoria reale. Se si annulla il riferimento alla proprietà, si eliminerà solo il riferimento alla proprietà; il riferimento 'myOtherReference' non è interessato, poiché ora punta direttamente alla memoria e non alla tua proprietà. Se vuoi davvero eliminare questo elemento dalla memoria, devi rimuovere TUTTI i riferimenti o implementare una logica di "smaltimento" decisiva, a quel punto & Quot; myOtherReference & Quot; sarebbe un puntatore a un oggetto disposto e qualsiasi chiamata ad esso genererà un'eccezione.

Altri suggerimenti

GWLlosa è perfetto. Inoltre, l'associazione dati Silverlight manterrà il ViewModel bloccato finché si dispone di un riferimento di associazione ad esso. In altre parole, & # 8217; sarà necessario rimuovere ViewModel dal DataContext della vista (impostando View.DataContext = null) oppure sarà necessario rimuovere la vista dall'albero visivo prima che ViewModel venga rilasciato . L'implementazione di IDisposable non avrebbe aiutato & # 8217; t e non lo avrei & # 8217; lo consiglio davvero. IDisposable è inteso per ripulire le risorse non gestite o per avere un maggiore controllo sullo smaltimento delle risorse gestite. In questo caso non è necessario se capisci correttamente come funzionano i collegamenti e i riferimenti e lasci che il garbage collector si occupi delle cose. Questo articolo potrebbe aiutare:

Ricerca di perdite di memoria nelle applicazioni WPF

It & # 8217; è principalmente WPF ma puoi usare anche le tecniche su Silverlight.

Fantastico vederti usare ViewModel a proposito. I & # 8217; sono un grande fan del modello.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top