8

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

2015-11-14 05:32:42.337 Buck Tracker[3537:1456100] * 由于未捕获的异常“NSInvalidUnarchiveOperationException”而终止应用程序,原因:“* -[NSKeyedUnarchiver decodeObjectForKey:]:无法解码类的对象 (iBudgeter.Record)键(NS.objects);该类可以在源代码或未链接的库中定义'

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

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

那么有什么建议吗?

4

6 回答 6

17

另一种方法是固定用于 NSCoding 的类的名称。您只需使用:

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

任何需要的地方。

看起来 iOS 扩展在类名前面加上扩展名。

于 2016-05-11T12:36:50.560 回答
8

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

NSKeyedArchiver.setClassName("OldModule.ClassName", for: ClassName.self)
NSKeyedUnarchiver.setClass(ClassName.self, forClassName: "OldModule.ClassName")
于 2017-08-29T15:24:00.550 回答
6

不要更改您的项目名称。只需更改显示名称即可。它是 Info.plist 中的“捆绑显示名称”条目。您可能需要添加条目。

将捆绑显示名称添加到 Info.plist

如果您想更改 OS X 应用程序的显示名称,请参阅此答案。

于 2015-11-13T21:58:39.593 回答
0

只需删除旧应用程序并再次运行它即可为我工作

于 2020-09-09T06:59:38.963 回答
0

我昨晚有这个问题。只需将“产品名称”(在构建设置下)更改回原始值,经过 3 小时的调查后对其进行排序。

于 2020-01-30T15:46:51.903 回答
0

仅将使用 NSCoding 协议的 ClassA 重命名为 ClassB 后,我遇到了同样的错误。

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

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

对我来说,解决方案只是删除用户默认值并再次运行该应用程序,它就可以工作了。

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

defaults delete buldle-identifier

于 2018-10-28T21:27:35.867 回答