Tiene que ser más específico. No es necesario verificar que TODOS los delegados al evento hayan sido cancelados, porque en un caso común, un suscriptor tiene una vida más corta que un editor. Y una pérdida de memoria solo ocurre cuando su suscriptor parece tener una vida más larga que un editor, por lo tanto, hay una referencia que impide que GC recopile el objeto editor.
Ahora tenemos que verificar que si se suscribe a un evento en un objeto de vida relativamente corta, se da de baja eventualmente.
Una heurística que se me ocurre en este caso: analizar todos los objetos de variables locales (que tienen el ámbito del bloque de código actual {}) y todos los objetos que explícitamente se descartan. Para cada evento en estos objetos, cuente la cantidad de veces que se suscribe y la cantidad de veces que se da de baja. Si el primer número es mayor, emita una advertencia.
Por supuesto que no cubre todos los casos, pero supongo que ningún enfoque estático puede cubrir todos los casos en este problema, necesita algún método que sea lo suficientemente bueno.
No mencionaré aquí las ventajas del análisis dinámico y las revisiones de códigos, ya que se trata de un tema separado, no relacionado con la pregunta.
gracias esto es lo más cercano a la respuesta que estaba buscando. Pero para ser justos, las otras respuestas también son ciertas, y estamos implementando referencias débiles siempre que sea posible. –