众所周知,当在代码中连接事件处理时,我们冒着将对象留在内存中的风险,从而造成内存泄漏。
为了实现一些特殊功能(禁用剪切和复制),我需要在 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但是我无法可靠地证明它被调用了。
更新
根据Michał Żołnieruk的建议,我在OldElement不为 null的检查中添加了 unhooking,但我从未看到任何证据证明这会被调用。
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;
}
}
当从 UI 中删除控件时,是否应该清理这些渲染器并因此触发该OnElementChanged方法?
至尊宝的传说
相关分类