# 踩过的坑

每条都真实发生过。

## 界面

- `NSColor.separatorColor` 在半透明面板上，背后是深色内容时会发白。用 `labelColor.withAlphaComponent(0.1)`。
- 文字截断时系统会收紧字距，悬停改变宽度时文字会偏移。设 `allowsDefaultTighteningForTruncation = false`。
- Core Graphics 的阴影偏移和模糊不随 CTM 缩放，图标缩小后会出现黑块。按 `ctx.ctm.a` 换算。

## 进程与环境

- 从访达打开的 App 拿不到 shell 的 PATH，要按常见安装位置找命令。命令行模式相反，直接用 PATH，失败时报告 `errno`。
- 经软链接运行时 `Bundle.main` 找不到 App 包，本地化和语言设置都会失效。用真实路径 `execv` 重新执行，argv 保持不变。只运行可执行文件本身测不出来，要经软链接测。
- App 和命令行共用可执行文件时，在创建 `NSApplication` 前分流，并忽略 `-psn_` 参数。
- 异步任务在命令行退出时会丢失，退出前要等队列清空。
- 软链接放在固定目录（`~/.local/bin`）。跟着别的程序的位置走，对方挪动后就管不到旧链接了。
- 新二进制第一次运行有系统检查，耗时要测重复运行的。

## 文件

- 监听目录而不是文件：原子写入会换掉文件。目录不存在时监听会静默失败，要先创建。
- 读取失败不等于内容为空。文件存在但读不了或解析不了时，不要继续写回。
- 整体写回别的程序的配置前检查修改时间，否则可能覆盖它刚写入的内容。
- 增量读取日志时按 inode 记偏移，文件可能被替换或裁剪。
- 测试不碰用户真实的设置和目录，用临时目录。必须动时先读出原值，结束后还原。

## 构建

- 同时传两个 `--arch` 时 SwiftPM 换用 XCBuild，LTO 不生效，每个架构大约大 18%。逐架构编译后用 `lipo` 合并。
- DMG 用 HFS+：APFS 会随机多出约 160 KB。量体积用 `stat`，`du` 会算入预分配。
- 系统自带的 Bash 3.2 在 `set -u` 下展开空数组会报错。用 `${A[@]+"${A[@]}"}`。
