重命名Xcode项目后NSKeyedUnarchiver错误

9

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

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

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

我尝试将项目名称改回iBudgeter,但没有成功。在Git中还原到以前的版本确实有所帮助,但是当我再次重命名后仍然遇到相同的错误。

那么有什么建议吗?


Buck Tracker 是否符合 NSCoding 协议? - JAL
你尝试过执行“clean”操作吗? - nsinvocation
@hal9000 我试过了,但是没有成功。 - hklel
@JAL 我应该怎么做才能符合 NSCoding 的要求? - hklel
您是否有现有用户的存储数据需要保留访问权限? - rob mayoff
@robmayoff 是的,重置模拟器确实有效,但这个应用程序已经在App Store上了,所以我不能这样做。 - hklel
6个回答

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

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

无论何时需要。

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


我花了半天时间在这上面。谢谢! - fluder

10

如果您将文件移动到另一个模块,您需要添加额外的信息。

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

1
这是正确的答案,当模块被更改或目标被复制等情况下。谢谢你。 - Onur Şahindur

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

adding Bundle display name to Info.plist

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


哇,你真是个救命恩人!我不知道我可以做到那个:D - hklel
如果您想要更改名称而不仅仅是显示名称,该如何操作? - dhruvm

2

我只需要删除旧应用程序并重新运行,这对我有效。


0
昨晚我遇到了这个问题。经过三个小时的调查,我最终将“产品名称”(在构建设置下)更改回原来的值,问题得以解决。

-1

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

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

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

对我来说解决方案就是删除用户默认值并重新运行应用程序,然后它就可以正常工作了。

要删除用户默认值,我在终端中使用了以下命令:

defaults delete buldle-identifier


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接