En général, oui, des références faibles doivent être utilisées. Mais d'abord, nous devons être clairs sur ce que vous entendez par «auditeurs d'événements».
Rappels
Dans certains styles de programmation, en particulier dans le contexte des opérations asynchrones, il est courant de représenter une partie d'un calcul comme un rappel qui est exécuté sur un certain événement. Par exemple, un Promise
[ 1 ] peut avoir une then
méthode qui enregistre un rappel à la fin de l'étape précédente:
promise =
Promise.new(async_task) # - kick off a task
.then(value => operation_on(value)) # - queue other operations
.then(value => other_operation(value)) # that get executed on completion
... # do other stuff in the meanwhile
# later:
result = promise.value # block for the result
Ici, les rappels enregistrés par then
doivent être tenus par des références fortes, car la promesse (la source de l'événement) est le seul objet contenant une référence au rappel. Ce n'est pas un problème car la promesse elle-même a une durée de vie limitée et sera récupérée après la fin de la chaîne de promesses.
Modèle d'observateur
Dans le modèle d'observateur, un sujet a une liste d'observateurs dépendants. Lorsque le sujet entre dans un état, les observateurs sont avertis selon une certaine interface. Des observateurs peuvent être ajoutés et supprimés du sujet. Ces observateurs n'existent pas dans un vide sémantique, mais attendent des événements dans un certain but.
Si cet objectif n'existe plus, les observateurs doivent être retirés du sujet. Même dans les langues récupérées, cette suppression peut devoir être effectuée manuellement. Si nous ne parvenons pas à retirer un observateur, il sera maintenu en vie via la référence du sujet à l'observateur, et avec lui tous les objets auxquels l'observateur fait référence. Cela gaspille de la mémoire et dégrade les performances car l'observateur (désormais inutile) sera toujours averti.
Les références faibles corrigent cette fuite de mémoire, car elles permettent à l'observateur d'être récupéré. Lorsque le sujet se déplace pour avertir tous les observateurs et constate qu'une des références faibles à un observateur est vide, cette référence peut être supprimée en toute sécurité. Alternativement, les références faibles peuvent être implémentées de manière à permettre au sujet d'enregistrer un rappel de nettoyage qui supprimera l'observateur lors de la collecte.
Mais notez que les références faibles ne sont qu'un pansement qui limite les dégâts en oubliant de retirer un observateur. La bonne solution serait de s'assurer qu'un observateur est retiré lorsqu'il n'est plus nécessaire. Les options comprennent:
Le faire manuellement, mais cela est sujet à des erreurs.
Utiliser quelque chose qui ressemble à essayer avec des ressources en Java ou using
en C #.
Destruction déterministe, par exemple via l'idiome RAII. Notez que dans un langage avec un ramasse-miettes déterministe, cela pourrait encore nécessiter de faibles références du sujet à l'observateur afin de déclencher le destructeur.