diff --git a/Sources/PlayerBridge.swift b/Sources/PlayerBridge.swift index 917a727..e4d081b 100644 --- a/Sources/PlayerBridge.swift +++ b/Sources/PlayerBridge.swift @@ -279,6 +279,11 @@ final class PlayerBridge: ObservableObject { func toggleFullscreen() { #if os(macOS) if let fw = fullscreenWindow { + // 先断开 AVPlayerLayer → player 引用,避免 autorelease pool drain 时 + // 与 CoreMedia 后台线程竞争 sFigNotificationCenterWeakListenerLinks + if let playerView = fw.contentView as? FullscreenPlayerView { + playerView.player = nil + } fw.close() fullscreenWindow = nil isFullscreen = false @@ -445,6 +450,15 @@ class FullscreenPlayerView: NSView { override var acceptsFirstResponder: Bool { true } + // 安全网:视图从窗口移除时主动断开 player 引用 + // 避免 CoreMedia 后台线程与 autorelease pool drain 竞争 + override func viewWillMove(toWindow newWindow: NSWindow?) { + if newWindow == nil { + playerLayer.player = nil + } + super.viewWillMove(toWindow: newWindow) + } + override func mouseDown(with event: NSEvent) { if event.clickCount == 2 { NotificationCenter.default.post(name: .init("ExitFullscreen"), object: nil)