我需要取消订阅Xamarin.Forms中的GestureRecogniser吗?

时间:2020-01-08 15:52:19

标签: c# xamarin xamarin.forms memory-leaks garbage-collection

因此,我具有以下控件,该控件是从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();
    }
}

This linkthis link都说我应该删除GestureRecognisers,但不解释原因

2 个答案:

答案 0 :(得分:1)

根据Cross-Platform Performance,建议您取消订阅GestureRecogniser。

为防止内存泄漏,应该在处理订阅者对象之前取消订阅事件。在取消订阅事件之前,发布对象中事件的委托人具有对该委托的引用,该委托封装了订阅者的事件处理程序。只要发布对象拥有此引用,垃圾回收就不会回收订户对象的内存。

答案 1 :(得分:-1)

除非您使用永久性页面,否则无需手动处置手势识别器。当任何正在使用它的页面被GC弹出并收集时,它将被销毁。

如果让您放心,您仍然可以手动处理它,它不会造成任何伤害,但这不是必需的。