macOS 14.0带点KeyPath绑定在nib解码时崩溃问题咨询
macOS 14.0(Sonoma)下NSObjectController绑定嵌套KeyPath与Swift String的崩溃问题
结论
这是macOS Sonoma(14.0)的系统Bug,你的绑定用法没有问题。
触发条件
崩溃需要同时满足所有以下条件:
- 模型属性为
@objc dynamic修饰的Swift原生String类型(而非NSString) - 绑定使用嵌套KeyPath(如
text.length) - 属性初始值是系统文本替换库中存在的字符串(例如"On my way!")
- 崩溃发生在nib解归档阶段,且关联到后台拼写检查线程
崩溃原因分析
从错误日志和复现场景来看:
- 系统拼写检查线程会在nib加载时自动处理文本内容,当识别到系统替换库中的字符串时,会隐式修改Swift String的底层存储(Swift String是值类型,与NSString的引用类型机制不同)
- KVO对Swift值类型的观察依赖于自动生成的包装层,当底层存储被意外替换后,KVO的观察者注册状态出现不一致,导致后续移除观察者或发送更新通知时抛出错误
- 使用
NSString时不会触发问题,因为它是引用类型,底层存储的变更会正确触发KVO通知;使用不在替换库中的字符串时,拼写检查线程不会干预修改,因此也不会崩溃
临时规避方案
可以选择以下任意一种方式解决:
- 将模型属性类型改为
NSString(如代码中注释的可行示例) - 延迟设置系统替换库中的字符串值,不在nib解归档阶段赋值(例如移到
viewDidLoad方法中设置) - 暂时避免使用嵌套KeyPath,直接绑定顶层属性(如绑定
text而非text.length)
内容的提问来源于stack exchange,提问作者Marek H
相关产品推荐
相关产品推荐

