内容提要
文章记录了一个macOS应用启动崩溃问题:报错“-[NSTaggedPointerString count]: unrecognized selector”,堆栈显示崩溃发生在NSLocale/NSUserDefaults初始化阶段。作者未改代码,已上线版本也无法运行,怀疑与国际化或Localizable.strings有关,但无修改记录。最终通过执行“defaults delete <bundle_id>”清除应用偏好设置解决。
延伸解读
崩溃根源不在业务代码
堆栈显示崩溃发生在 NSUserDefaults 初始化过程中,进而调用 NSLocale 获取当前区域设置时触发异常。这意味着问题出在系统读取应用偏好或区域配置的环节,而非应用自身的业务逻辑。作者未改代码、已上线版本也无法运行,进一步印证了这一点。排查时应优先关注环境状态而非源码。
清除偏好设置为何有效
执行 defaults delete <bundle_id> 清除了该应用的全部偏好设置,使 NSUserDefaults 在初始化时不再读取到异常数据,从而绕过了崩溃路径。这提示问题可能源于偏好设置中某个与区域或国际化相关的键值被写坏或类型不匹配,导致系统在构造 NSLocale 时对字符串错误地调用了 count 方法。
国际化配置的潜在风险
作者怀疑与 Localizable.strings 或国际化配置有关,但无修改记录。结合堆栈中的 _CFLocaleCreateLocaleIdentifierForAvailableLocalizations,应用可用的本地化列表可能被异常处理,进而影响 NSLocale 的构造。虽然本次通过清除偏好解决,但若国际化资源存在类型或格式问题,仍可能在其他环境复现,值得后续检查本地化文件的完整性。
Q&A
macOS应用启动时崩溃,报错-[NSTaggedPointerString count]: unrecognized selector sent to instance,是什么原因?
根据文章,该崩溃发生在NSLocale/NSUserDefaults初始化阶段,堆栈显示_CFLocaleCreateLocaleIdentifierForAvailableLocalizations调用时向NSTaggedPointerString发送了count消息导致崩溃。作者怀疑与国际化或Localizable.strings有关,但代码无修改记录,最终通过清除应用偏好设置解决。
如何解决-[NSTaggedPointerString count]: unrecognized selector崩溃?
执行命令“defaults delete <bundle_id>”清除应用的偏好设置即可解决。
为什么已上线的版本也出现同样的崩溃?
文章中提到,作者发现已上线的版本也无法运行,说明问题可能与代码修改无关,而是与系统环境或应用偏好设置有关。
崩溃堆栈显示在NSLocale/NSUserDefaults初始化阶段,具体是哪个函数调用导致的?
堆栈显示崩溃发生在_CFLocaleCreateLocaleIdentifierForAvailableLocalizations函数中,该函数在初始化NSLocale时被调用,进而触发了向NSTaggedPointerString发送count消息。
是否与Localizable.strings文件有关?
作者怀疑与国际化或Localizable.strings有关,但实际上没有任何修改记录,因此不能确定直接关联。
defaults delete命令的作用是什么?
defaults delete <bundle_id>命令用于删除指定bundle ID的应用的偏好设置文件,清除可能损坏或冲突的配置数据,从而解决因偏好设置异常导致的崩溃。