
Les gestionnaires d'événements interfèrent-ils avec le garbage collection ?
Question :
Considérez le code suivant :
MyClass pClass = new MyClass();
pClass.MyEvent += MyFunction;
pClass = null;
Copier après la connexion
La pClass sera-t-elle collectée ? Ou va-t-il persister et continuer à déclencher des événements ? Devez-vous vous désinscrire des événements comme celui-ci :
MyClass pClass = new MyClass();
pClass.MyEvent += MyFunction;
pClass.MyEvent -= MyFunction;
pClass = null;
Copier après la connexion
Réponse :
Collecte des déchets par éditeur d'événement :
L'abonnement à MyEvent n'affecte pas le garbage collection de pClass (éditeur).
Collecte des déchets de l'objet cible :
En général, le comportement du garbage collection dépend du fait que MyFunction soit une méthode d'instance ou une méthode statique :
-
Méthodes d'instance : L'abonnement de MyFunction à MyEvent inclut une référence à MyClass. Par conséquent, cela peut empêcher le garbage collection de l’objet cible. Toutefois, ce problème cesse une fois que l'objet éditeur devient éligible à la collection.
-
Méthodes statiques : Les événements statiques n'empêchent pas l'objet cible d'être récupéré.
Autres notes :
- Si l'éditeur (par exemple, pClass) a une longue durée de vie et survit à l'objet cible (par exemple, l'objet contenant MyFunction), vous devez vous désinscrire pour vous assurer que l'objet cible peut être récupéré.
- Les événements statiques sont particulièrement dangereux lorsqu'ils sont utilisés conjointement avec des gestionnaires basés sur des instances, car ils peuvent empêcher indéfiniment le garbage collection de l'objet cible.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!