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

Posted

技术标签:

【中文标题】重命名 Xcode 项目后出现 NSKeyedUnarchiver 错误【英文标题】:NSKeyedUnarchiver error after renaming Xcode project 【发布时间】:2016-02-15 14:14:24 【问题描述】:

我刚刚重命名了我的 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 协议? 您是否尝试过“干净”? @hal9000 我做了,但没用 @JAL 我应该怎么做才能使其符合NSCoding 您是否拥有想要保留访问权限的已存储数据的现有用户? 【参考方案1】:

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

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

任何需要的地方。

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

这是模块更改或目标被复制等时的正确答案。谢谢。【参考方案3】:

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

如果您想更改 OS X 应用的显示名称,请参阅 this answer。

【讨论】:

哇,你是救生员!不知道我能做到这一点:D 如果您想更改名称而不仅仅是显示名称,该怎么做?【参考方案4】:

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

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

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

对我来说,解决方案只是删除用户默认设置并再次运行应用程序,它就成功了。

要删除我在终端中使用此命令的默认值:

defaults delete buldle-identifier

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

只需删除旧应用程序并再次运行它对我有用

【讨论】:

以上是关于重命名 Xcode 项目后出现 NSKeyedUnarchiver 错误的主要内容,如果未能解决你的问题,请参考以下文章

重命名项目/工作区后,出现多个“未声明的标识符”错误——但构建良好

重命名项目Xcode后显示红色的新项目名称和未显示的文件

Xcode,我如何完全重命名一个项目?

iphone 项目 - 在 xcode 4.3 中复制和重命名

如何在 Xcode 5 中重命名项目?

在 git 文件重命名后使 Xcode 5 跟随历史