重命名 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 错误的主要内容,如果未能解决你的问题,请参考以下文章
重命名项目/工作区后,出现多个“未声明的标识符”错误——但构建良好