mirror of
https://github.com/feigeCode/navop.git
synced 2026-11-06 08:07:31 +00:00
fork-0.3.121 是 Touch Bar 守卫的第三版,方向从「跳过」改成「只吸收那一个异常」。 ## 为什么还要再改 fork-0.3.118 的守卫对查找器发起的注销一律直接 return。这太重:KVO 的契约要求合法注册必须 可注销,跳过第一次合法注销会留下「已注册、但调用方以为已注销」的观察项 —— 真机退出应用时 崩在 Foundation KVO 记账里(`navop-2026-09-27-165228.ips`,`KERN_INVALID_ADDRESS`)的头号 嫌疑就是它。 ## fork-0.3.121 做了什么 - 每一次注销都真的执行,转发放进 `objc2::exception::catch`(`objc2` 的 `exception` feature, 即 C 编译出来的 `@try`/`@catch`)。正常返回 ⇒ 注销真的发生了,记账保持一致。 - 抛出时只匹配这一种组合:观察者是查找器的、key path 是 `nextResponder`、异常名 `NSRangeException`、reason 含 `because it is not registered as an observer`。匹配 ⇒ 记一条 warn(观察者类与地址、被观察对象类与地址、key path、context、异常名与 reason)后吸收。 - 不匹配 ⇒ `objc2::exception::throw` 原样重抛,让它像从被替换的实现里抛出一样 `C-unwind` 穿过守卫。Cocoa 不是异常安全的,网撒太大会把 bug 藏起来而不是修掉。 `fork-0.3.121` 快照提交 `c335307a`,`zed-rev` = `83e4b04b60` (`gpui_macos: Answer the Touch Bar finder's duplicate retraction instead of skipping retractions`)。 ## 验证 - 上游 `cargo test -p gpui_macos --lib`:16 passed / 0 failed。新增 `the_finders_first_retraction_removes_and_the_duplicate_is_absorbed`(旧版做错的那件事)、 `another_key_paths_retraction_is_thrown_back` 与 `only_the_unregistered_next_responder_retraction_counts`(把网收窄)、以及 `rethrow` probe。 - 本仓 `cargo check -p one-core -p main --all-targets`:通过(exit 0)。 - 24 条 `[patch.crates-io]` 与 `Cargo.lock` 同步指向 `fork-0.3.121`。 docs/macos-memory-investigation.md 新增 §10.10 记录这一轮的判断与证据。 真机第五版组合 = 弹窗只隐藏不销毁(§10.7)+ 这版守卫。