Files
navop/docs
胡飞 99fc35bd58 chore(deps): 切到 gpui-pre fork-0.3.121(守卫只吸收那一个重复注销异常)
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)+ 这版守卫。
2026-09-28 16:07:41 +08:00
..