{
if (activatedEventHandler == null)
{
- activatedEventCallback = OnActivated;
+ CreateSafeCallback(OnActivated, out activatedEventCallback);
ActivatedSignal().Connect(activatedEventCallback);
}
if (activatedEventHandler == null && activatedEventCallback != null)
{
ActivatedSignal().Disconnect(activatedEventCallback);
+ ReleaseSafeCallback(ref activatedEventCallback);
}
}
}
{
if (eventReceivedEventHandler == null)
{
- eventReceivedEventCallback = OnEventReceived;
+ CreateSafeCallback(OnEventReceived, out eventReceivedEventCallback);
EventReceivedSignal().Connect(eventReceivedEventCallback);
}
if (eventReceivedEventHandler == null && eventReceivedEventCallback != null)
{
EventReceivedSignal().Disconnect(eventReceivedEventCallback);
+ ReleaseSafeCallback(ref eventReceivedEventCallback);
}
}
}
{
if (statusChangedEventHandler == null)
{
- statusChangedEventCallback = OnStatusChanged;
+ CreateSafeCallback(OnStatusChanged, out statusChangedEventCallback);
StatusChangedSignal().Connect(statusChangedEventCallback);
}
if (statusChangedEventHandler == null && statusChangedEventCallback != null)
{
StatusChangedSignal().Disconnect(statusChangedEventCallback);
+ ReleaseSafeCallback(ref statusChangedEventCallback);
}
}
}
{
if (resizedEventHandler == null)
{
- resizedEventCallback = OnResized;
+ CreateSafeCallback(OnResized, out resizedEventCallback);
ResizedSignal().Connect(resizedEventCallback);
}
if (resizedEventHandler == null && resizedEventCallback != null)
{
ResizedSignal().Disconnect(resizedEventCallback);
+ ReleaseSafeCallback(ref resizedEventCallback);
}
}
}
{
if (languageChangedEventHandler == null)
{
- languageChangedEventCallback = OnLanguageChanged;
+ CreateSafeCallback(OnLanguageChanged, out languageChangedEventCallback);
LanguageChangedSignal().Connect(languageChangedEventCallback);
}
if (languageChangedEventHandler == null && languageChangedEventCallback != null)
{
LanguageChangedSignal().Disconnect(languageChangedEventCallback);
+ ReleaseSafeCallback(ref languageChangedEventCallback);
}
}
}
{
if (keyboardTypeChangedEventHandler == null)
{
- keyboardTypeChangedEventCallback = OnKeyboardTypeChanged;
+ CreateSafeCallback(OnKeyboardTypeChanged, out keyboardTypeChangedEventCallback);
KeyboardTypeChangedSignal().Connect(keyboardTypeChangedEventCallback);
}
if (keyboardTypeChangedEventHandler == null && keyboardTypeChangedEventCallback != null)
{
KeyboardTypeChangedSignal().Disconnect(keyboardTypeChangedEventCallback);
+ ReleaseSafeCallback(ref keyboardTypeChangedEventCallback);
}
}
}
{
if (contentReceivedEventHandler == null)
{
- contentReceivedEventCallback = OnContentReceived;
+ CreateSafeCallback(OnContentReceived, out contentReceivedEventCallback);
ContentReceivedSignal().Connect(contentReceivedEventCallback);
}
if (contentReceivedEventHandler == null && contentReceivedEventCallback != null)
{
ContentReceivedSignal().Disconnect(contentReceivedEventCallback);
+ ReleaseSafeCallback(ref contentReceivedEventCallback);
}
}
}
//You should not access any managed member here except static instance
//because the execution order of Finalizes is non-deterministic.
+ if (type == DisposeTypes.Explicit)
+ {
+ DisconnectNativeSignals();
+ }
+
+ base.Dispose(type);
+ }
+
+ private void DisconnectNativeSignals()
+ {
+ if (HasBody() == false)
+ {
+ NUILog.Debug($"[Dispose] DisConnectFromSignals() No native body! No need to Disconnect Signals!");
+ return;
+ }
+
if (activatedEventCallback != null)
{
ActivatedSignal().Disconnect(activatedEventCallback);
+ activatedEventCallback = null;
}
if (eventReceivedEventCallback != null)
{
EventReceivedSignal().Disconnect(eventReceivedEventCallback);
+ eventReceivedEventCallback = null;
}
if (statusChangedEventCallback != null)
{
StatusChangedSignal().Disconnect(statusChangedEventCallback);
+ statusChangedEventCallback = null;
}
if (resizedEventCallback != null)
{
ResizedSignal().Disconnect(resizedEventCallback);
+ resizedEventCallback = null;
}
if (languageChangedEventCallback != null)
{
LanguageChangedSignal().Disconnect(languageChangedEventCallback);
+ languageChangedEventCallback = null;
}
if (keyboardTypeChangedEventCallback != null)
{
KeyboardTypeChangedSignal().Disconnect(keyboardTypeChangedEventCallback);
+ keyboardTypeChangedEventCallback = null;
}
if (contentReceivedEventCallback != null)
{
ContentReceivedSignal().Disconnect(contentReceivedEventCallback);
+ contentReceivedEventCallback = null;
}
-
- base.Dispose(type);
}
/// This will not be public opened.
}
}
+ void CreateSafeCallback<T>(T method, out T safeCallback) where T : Delegate
+ {
+ AddToNativeHolder(method);
+ safeCallback = method;
+ }
+
+ void ReleaseSafeCallback<T>(ref T safeCallback) where T : Delegate
+ {
+ System.Diagnostics.Debug.Assert(safeCallback != null);
+ // FIXME: If eventReceivedEventCallback is removed from nativeholder,
+ // then it is called from unmanaged code although it is disconnected.
+ // So the callbacks are not removed from nativeholder until dispose.
+ // RemoveFromNativeHolder(safeCallback);
+ safeCallback = null;
+ }
+
/// <summary>
/// This structure is used to pass on data from the IMF regarding predictive text.
/// </summary>