В этом случае вам действительно необходим не какой-то способ автоматического отсоединения, а обеспечение того, чтобы ссылка, хранящаяся в долгоживущем объекте, не удерживала поведение (и, следовательно, все остальное, на которое он ссылается) от сбора мусора.
Это достигается путем реализации шаблона посредника. Концепция заключается в том, что вы не предоставляете долгоживущему объекту делегат со ссылкой на ваш Behaviour
, вместо этого вы создаете класс Mediator в качестве посредника. Посредник присоединяется к событию долгоживущих объектов и сохраняет WeakReference для поведения. Когда долгоживущий объект запускает событие, посредник проверяет, что WeakReference
еще жив, если это так, вызывает метод для передачи события. Если при возникновении события посредник обнаруживает, что WeakReference
больше не существует, он отсоединяет свой обработчик события от долгоживущего объекта.
Следовательно, ничто не мешает поведению, а все остальное, что связано с сборкой мусора, все, что осталось, это очень маленький экземпляр посредника с мертвой ссылкой, все еще прикрепленной к долгоживущему объекту. Поскольку эти посредники крошечные, они не представляют реальной проблемы, и даже они исчезнут в следующий раз, когда произойдет событие.
К счастью, вам не нужно создавать это самостоятельно, другие уже сделали это. Это называется WeakEventListener
. Этот блог: Выделение «слабого» вклада; Улучшения делают предотвращение утечек памяти с помощью WeakEventListener еще проще! имеет отличный набор ссылок по теме.