         #endif
         view.removeFromSuperview()
 
-        trigger(Event.didDestroy.rawValue)
+        trigger(.didDestroy)
+    }
+
+    private func safeDestroy(_ plugin: Plugin) {
+        do {
+            try ObjC.catchException {
+                plugin.destroy()
+            }
+        } catch {
+            Logger.logError("\((plugin as Plugin).pluginName) crashed during destroy (\(error.localizedDescription))", scope: "Core")
+        }
     }
 }


    #if os(tvOS)
    private func renderPlugins() {
        plugins.forEach { plugin in
            render(plugin)
        }
    }
    #endif

    #if os(iOS)

    private func renderCorePlugins() {
        plugins.filter { isNotMediaControlPlugin($0) }.forEach { plugin in
            render(plugin)
        }
    }

    private var mediaControlPlugin: MediaControl? {
        return plugins.first { $0 is MediaControl } as? MediaControl
    }


    @objc open func destroy() {
        Logger.logDebug("destroying", scope: "Core")

        trigger(.willDestroy)

        Logger.logDebug("destroying listeners", scope: "Core")
        stopListening()

        Logger.logDebug("destroying containers", scope: "Core")
        containers.forEach { $0.destroy() }
        containers.removeAll()

        Logger.logDebug("destroying plugins", scope: "Core")
        plugins.forEach(safeDestroy)
        plugins.removeAll()

        Logger.logDebug("destroyed", scope: "Core")
