Нужно ли отписываться от GestureRecogniser в Xamarin.Forms? - PullRequest
1 голос
/ 08 января 2020

Итак, у меня есть следующий элемент управления, расширенный с Label

public Hyperlink()
{
    var tapGesture = new TapGestureRecognizer();
    tapGesture.Tapped += TapGesture_Tapped;
    this.GestureRecognizers.Add(tapGesture);
}

Теперь мой вопрос: нужно ли отсоединять GestureRecogniser?

Мое понимание GarbageCollection заключается в том, что поскольку объект Hyperlink отвечает за tapGesture, он должен иметь возможность его утилизировать; но это мир Xamarin.Forms, где все идет.

Так что мне нужен код Dispose, чтобы избежать потенциальной утечки памяти и сохранить объект живым

public void Dispose()
{
    if (this.GestureRecognizers.Count > 0)
    {
        var tapGesture = this.GestureRecognizers[0] as TapGestureRecognizer;
        tapGesture.Tapped -= TapGesture_Tapped;
        this.GestureRecognizers.Clear();
    }
}

Эта ссылка , а также Эта ссылка говорит, что я должен удалить GestureRecognisers, но не раскрывает, почему

Ответы [ 2 ]

1 голос
/ 09 января 2020

В соответствии с Межплатформенной производительностью , предлагаем вам отказаться от подписки на GestureRecogniser.

Чтобы предотвратить утечки памяти, события должны быть отписаны до того, как объект подписчика будет удален. До тех пор, пока событие не будет отписано, делегат для события в объекте публикации имеет ссылку на делегат, который инкапсулирует обработчик событий подписчика. Пока объект публикации содержит эту ссылку, сборщик мусора не будет восстанавливать память объекта подписчика.

0 голосов
/ 08 января 2020

Если вы не используете постоянные страницы, вам не нужно вручную утилизировать свой распознаватель жестов. он будет уничтожен, когда G C.

извлечет и соберет любую использованную им страницу. Если это вас не устраивает, вы все равно можете утилизировать ее вручную, и это ничего не повредит, но это не требуется.

...