Хорошо известно, что при подключении обработки событий в коде мы рискуем оставить объекты в памяти и, таким образом, создать утечку памяти.
Для достижения некоторых специальных функций (отключение копирования и копирования)) Мне нужно реализовать пользовательские рендеры на UWP.Хотя отключение копирования и копирования не относится строго к вопросу, мне пришлось подключить обработчики событий, чтобы добиться этого.
protected override void OnElementChanged(ElementChangedEventArgs<Editor> e)
{
base.OnElementChanged(e);
if (this.Control == null) { return; }
this.Control.CopyingToClipboard += Control_CopyingToClipboard;
this.Control.CuttingToClipboard += Control_CuttingToClipboard;
}
private void Control_CuttingToClipboard(TextBox sender,
TextControlCuttingToClipboardEventArgs args)
{
args.Handled = true;
}
private void Control_CopyingToClipboard(TextBox sender,
TextControlCopyingToClipboardEventArgs args)
{
args.Handled = true;
}
Вопрос
Чтоявляется правильным местом для отсоединения этих обработчиков событий, чтобы предотвратить любую форму утечки?
Я заметил, что есть реализация IDisposable
, а не VisualElementRenderer<TElement, TNativeElement>
в пространстве имен платформы UWP
, однако я не сделалсмог надежно доказать, что это вызывается.
Обновление
Согласно Михал Жольнерук предложение Я добавил отцепку внутри проверки дляOldElement
не равно нулю, однако я никогда не вижу доказательств того, что это вызывается.
protected override void OnElementChanged(ElementChangedEventArgs<Editor> e)
{
base.OnElementChanged(e);
if (this.Control == null) { return; }
if (e.OldElement != null)
{
System.Debug.WriteLine("I NEVER SEE THIS");
this.Control.CopyingToClipboard -= Control_CopyingToClipboard;
this.Control.CuttingToClipboard -= Control_CuttingToClipboard;
}
if (e.NewElement != null)
{
this.Control.CopyingToClipboard += Control_CopyingToClipboard;
this.Control.CuttingToClipboard += Control_CuttingToClipboard;
}
}
Когда элементы управления удаляются из пользовательского интерфейса, следует ли очищать эти средства визуализации и, таким образом, запускать метод OnElementChanged
?