Как я могу удалить / собрать мусор прикрепленный метод из события tabbarController.ViewControllerSelected?

У меня есть этот код, который прикрепляет: OnTabbarControllerItemSelected; к tabbarController.ViewControllerSelected. Насколько я понимаю, такие прикрепленные события также должны быть отделены позже.

Может кто-нибудь посоветует, где мне делать отсоединение. Также я должен переопределить метод Dispose для этого кода, и если да, то как мне это сделать?

Код:

    protected override void OnElementChanged(VisualElementChangedEventArgs e)
    {
        base.OnElementChanged(e);

        if (e.NewElement != null)
        {
            _page = (MainPage)e.NewElement;
        }
        else
        {
            _page = (MainPage)e.OldElement;
        }

        if (e.OldElement != null)
        {
            Xamarin.Forms.Application.Current.PropertyChanged -= Current_PropertyChanged;
            return;
        }

        try
        {
            var tabbarController = (UITabBarController)this.ViewController;

            if (null != tabbarController)
            {
                Xamarin.Forms.Application.Current.PropertyChanged += Current_PropertyChanged; //subscribe to the App class' built in property changed event
                tabbarController.ViewControllerSelected += OnTabbarControllerItemSelected;

                UpdateTheme();
            }
        }
        catch (Exception exception)
        {
            Console.WriteLine(exception);
        }
    }

Был бы признателен за совет о том, как я могу отсоединить этот метод аналогично тому, как отсоединяется метод Current_PropertyChanged.

У вас есть несколько UITabBarController? Вам нужно подписываться на событие ViewControllerSelected event каждый раз, когда происходит событие ElementChanged?

dymanoid 12.11.2018 18:27
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
171
2

Ответы 2

Вы пробовали tabbarController.ViewControllerSelected -= OnTabbarControllerItemSelected;?

Где бы это было размещено. Не могли бы вы дать полный пример кода в своем ответе. Спасибо

Alan2 30.10.2018 05:58

Я думаю, что место, где будет размещено, зависит от того, где вы его отсоединяете. Это просто способ отсоединить этот метод.

Jack Hua 30.10.2018 06:13

Насколько я понимаю, обработчик событий - это просто делегат, обычный объект ссылочного типа под управлением GC. Его не нужно отсоединять вручную, если он остается действительным до тех пор, пока сборщик мусора не соберет событие. Это должно быть верно в большинстве случаев (например, обработчик внутри того же окна).

Возможно, вам потребуется отсоединить вручную. Это происходит, когда дочерний объект прослушивает событие родительского объекта. Если дочерний объект может быть удален до родительского, обработчик становится недопустимым (поскольку он может относиться к удаленному дочернему объекту). В этом случае вы всегда должны знать, когда он становится недействительным (в приведенном выше случае, Dispose дочернего объекта), и когда и где вы должны его отсоединить.

РЕДАКТИРОВАТЬ Из предоставленного вами кода это непросто сказать, но, скорее всего, вам не нужно отсоединять OnTabbarControllerItemSelected. Но с Xamarin.Forms.Application.Current.PropertyChanged, наверное, нужно быть осторожнее.

Также см. этот вопрос.

Другие вопросы по теме