Devi essere più specifico. Non è necessario verificare che TUTTI i delegati dell'evento siano stati annullati, perché in un caso comune un abbonato vive più breve di un editore. E una perdita di memoria si verifica solo quando il tuo abbonato sembra essere più longevo di un editore, quindi c'è un riferimento, che impedisce a GC di raccogliere l'oggetto editore.
Ora dobbiamo verificare che, se ti iscrivi a un evento su un oggetto a vita relativamente breve, puoi cancellarti da esso.
Un'euristica che riesco a fare in questo caso: analizzare tutti gli oggetti a variabile locale (definiti dal blocco di codice corrente {}) e tutti gli oggetti, che vengono eliminati in modo esplicito. Per ogni evento su questi oggetti conta il numero di volte in cui ti sei iscritto e il numero di volte in cui ti sei cancellato. Se il primo numero è maggiore, emettere un avviso.
Ovviamente questo non copre tutti i casi, ma suppongo che nessun approccio statico possa coprire tutti i casi in questo problema, è necessario un metodo che sia abbastanza buono.
Non menzionerò qui i vantaggi dell'analisi dinamica e delle revisioni del codice poiché si tratta di un argomento separato, non correlato alla domanda.
fonte
2009-06-12 14:43:38
grazie questo è il più vicino alla risposta che stavo cercando. Ma in tutta onestà anche le altre risposte sono vere, e stiamo implementando riferimenti deboli laddove possibile. –