diff --git a/errors/src/iosMain/kotlin/dev/icerock/moko/errors/handler/ExceptionHandlerBinder.kt b/errors/src/iosMain/kotlin/dev/icerock/moko/errors/handler/ExceptionHandlerBinder.kt index ed587ea..2eeac2e 100644 --- a/errors/src/iosMain/kotlin/dev/icerock/moko/errors/handler/ExceptionHandlerBinder.kt +++ b/errors/src/iosMain/kotlin/dev/icerock/moko/errors/handler/ExceptionHandlerBinder.kt @@ -8,6 +8,7 @@ import dev.icerock.moko.errors.ErrorEventListener import dev.icerock.moko.errors.presenters.ErrorPresenter import dev.icerock.moko.mvvm.dispatcher.EventsDispatcher import platform.UIKit.UIViewController +import kotlin.native.ref.WeakReference actual interface ExceptionHandlerBinder { fun bind(viewController: UIViewController) @@ -17,11 +18,22 @@ actual class ExceptionHandlerBinderImpl actual constructor( private val errorPresenter: ErrorPresenter, private val eventsDispatcher: EventsDispatcher> ) : ExceptionHandlerBinder { + + private var eventsListener: ErrorEventListener? = null + override fun bind(viewController: UIViewController) { - eventsDispatcher.listener = object : ErrorEventListener { + eventsListener = createEventsListener(viewController) + eventsDispatcher.listener = eventsListener + } + + private fun createEventsListener(viewController: UIViewController) = + object : ErrorEventListener { + val viewControllerRef = WeakReference(viewController) + override fun showError(throwable: Throwable, data: T) { - errorPresenter.show(throwable, viewController, data) + viewControllerRef.get()?.let { + errorPresenter.show(throwable, it, data) + } } } - } }