Skip to content

修复:关闭贴图时进程闪退 - #27

Merged
Cocoon-break merged 1 commit into
mainfrom
fix/pin-close-crash
Nov 2, 2026
Merged

Cocoon-break merged 1 commit into
mainfrom
fix/pin-close-crash

Conversation

@Cocoon-break

Copy link
Copy Markdown
Owner

问题

v0.5.2 关闭贴图(双击 / Esc / 右键“关闭”)时进程 SIGABRT 退出。崩溃报告:-[NSWindow removeObserver:forKeyPath:] 抛 NSRangeException(contentLayoutRect 观察者未注册),调用自 WKWindowVisibilityObserver stopObserving ← removeFromSuperview;应用日志里崩溃时刻正好是 shot 关闭贴图 1。

原因

贴图窗口建好时 WKWebView 已在窗口上挂 KVO(类变成 NSKVONotifying_TaoWindow),show_pin 随后用 RawNSPanel::from_window 做 object_setClass;销毁时 WebKit 按新类注销 KVO 对不上,抛异常,panic=abort 下整个进程退出。主面板、截图遮罩、翻译卡片、录屏边框也换过类,但从不销毁(含退出时),不受影响。

最小 Swift 复现(NSWindow 子类 + WKWebView → object_setClass 成 NSPanel 子类 → removeFromSuperview)得到同一个异常与调用栈;销毁前把类换回去则正常。

修复

show_pin 换类前按贴图序号记下原来的类;pin_close 在主线程先换回再 destroy。若期间窗口类又变了(换类后又被挂 KVO),只隐藏不销毁,避免第二种崩溃。

验收

  • make check
  • 真机:截图 → 贴图 → 双击 / Esc / 右键“关闭”各一次,应用不退出

🤖 Generated with Claude Code

贴图窗口建好时 WKWebView 已在窗口上挂了 KVO,之后 from_window 用 object_setClass 换成 NSPanel;
destroy 拆 webview 时 WebKit 按新类注销 KVO 对不上,抛 NSRangeException,panic=abort 下整个进程退出。
换类前按贴图序号记下原来的类,关闭时在主线程先换回再销毁;类在此期间又变了就只隐藏不销毁。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Cocoon-break
Cocoon-break merged commit 32f7697 into main Nov 2, 2026
2 checks passed
@Cocoon-break
Cocoon-break deleted the fix/pin-close-crash branch November 2, 2026 08:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant