From a06b3f25d390ad59f80c3b76aaea8ec451ac8a3f Mon Sep 17 00:00:00 2001 From: Miguel de Icaza Date: Mon, 14 Jan 2019 14:51:56 -0500 Subject: [PATCH] [UIKit] UIGestureRecognizer's custon OnDispose method needs to queue the actual operation on the main thread --- src/UIKit/UIGestureRecognizer.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/UIKit/UIGestureRecognizer.cs b/src/UIKit/UIGestureRecognizer.cs index 2943e99a730d..a698931d5d99 100644 --- a/src/UIKit/UIGestureRecognizer.cs +++ b/src/UIKit/UIGestureRecognizer.cs @@ -34,12 +34,21 @@ public partial class UIGestureRecognizer { { } - // Called by the Dispose() method + // Called by the Dispose() method, because this can run from a finalizer, we need to + // (a) reference the handle, that we will release later, and (b) to remove the targets on the + // UI thread. void OnDispose () { - foreach (var kv in recognizers) - RemoveTarget (kv.Key, kv.Value); + var copyOfRecognizers = recognizers; + var savedHandle = Handle; recognizers = null; + + DangerousRetain (savedHandle); + NSRunLoop.Main.BeginInvokeOnMainThread (() => { + foreach (var kv in copyOfRecognizers) + RemoveTarget (kv.Key, kv.Value); + DangerousRelease (savedHandle); + }); } //