重命名 Xcode 项目后出现 NSKeyedUnarchiver 错误

NSKeyedUnarchiver error after renaming Xcode project

我刚刚重命名了我的 Xcode 项目,当我 运行 它时我得到了这个错误:

2015-11-14 05:32:42.337 Buck Tracker[3537:1456100] * Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: '* -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (iBudgeter.Record) for key (NS.objects); the class may be defined in source code or a library that is not linked'

Buck Tracker为新名,iBudgeter为原名。 Record 是我为存储一些数据而创建的自定义 NSObject

我尝试将项目重命名回 iBudgeter,但没有成功。在 git 中恢复到以前的版本确实有帮助,但是当我再次重命名它时我遇到了同样的错误。

有什么建议吗?

不要更改您的项目名称。只需更改显示名称即可。这是您 Info.plist 中的 "Bundle display name" 条目。您可能需要添加条目。

如果要更改 OS X 应用程序的显示名称,请参阅

另一种方法是修复用于 NSCoding 的 class 的名称。您只需使用:

  • NSKeyedArchiver.setClassName("Record", forClass: Record.self 序列化前
  • NSKeyedUnarchiver.setClass(Record.self, forClassName: "Record") 反序列化前

任何需要的地方。

看起来 iOS 扩展名在 class 名称前加上扩展名。

如果您将文件移动到另一个模块,则需要添加其他信息

NSKeyedArchiver.setClassName("OldModule.ClassName", for: ClassName.self)
NSKeyedUnarchiver.setClass(ClassName.self, forClassName: "OldModule.ClassName")

我只是将使用 NSCoding 协议的 ClassA 重命名为 ClassB 后出现了同样的错误。

对我来说,问题是我在我的 UserDefaults 中使用了 ClassA。 因此,UserDefaults .plist 中存储了旧名称 ClassA。

应用程序启动时尝试读取 .plist,但由于名称不匹配,应用程序崩溃了。

我的解决方案只是 删除用户默认设置并 运行 再次应用程序 并且成功了。

要删除默认值,我在终端中使用了这个命令:

defaults delete buldle-identifier

我昨晚遇到了这个问题。通过简单地将 'Product Name' (在构建设置下)更改回原始值,在 3 小时调查后对其进行了排序。

只需删除旧应用程序,运行它又对我有用