Reprenons du début
Un évènement, qu'est-ce que c'est ? C'est une liste de méthodes à appeler quand quelque chose se produit. Ces méthodes sont représentées par des delegates.
Un delegate, c'est quoi ? En simplifiant un peu les choses, c'est :
- Une référence vers un objet cible X
- La méthode M à appeler sur cet objet
Supposons que tu t'abonnes à un évènement E d'un objet Z avec la méthode X.M :
Cela fait que l'objet Z va conserver une référence vers l'objet X (via le delegate). X ne pourra donc pas être collecté par le garbage collector, car il est toujours accessible via Z. X va donc rester en mémoire aussi longtemps que Z...
Prenons un exemple plus concret. Disons que Z est la fenêtre principale de ton application : il a donc une longue durée de vie, puisqu'a priori la fenêtre principale continue d'exister pendant toute l'exécution de l'application. Supposons qu'à chaque fois que tu cliques sur un bouton, tu crées une nouvelle fenêtre de dialogue X, qui s'abonne à un évènement de Z : si X n'est pas désabonnée de l'évènement, elle reste indéfiniment en mémoire. Et à chaque clic sur le bouton, tu crées une nouvelle fenêtre qui va elle aussi rester en mémoire... donc tu utilises de plus en plus de mémoire, alors que les objets qui occupent cette mémoire ne sont plus utilisés. Donc, il faut soit se désabonner de l'évènement pour permettre au GC de récupérer la mémoire occupée par ces objets, soit réutiliser le même objet X à chaque fois, de façon à ne pas créer inutilement plusieurs instances qui occuperont de la mémoire
J'espère que c'est plus clair
Partager