我刚刚重命名了我的Xcode项目,当我运行它时出现了这个错误:
2015-11-14 05:32:42.337 Buck Tracker [3537:1456100] *由于未捕获的异常终止应用程序' NSInvalidUnarchiveOperationException',原因:' * - [NSKeyedUnarchiver decodeObjectForKey:]:无法解码类(iBudgeter.Record)的对象(NS.objects);该类可以在源代码中定义,也可以在未链接的库中定义
Buck Tracker
是新名称,iBudgeter
是原始名称。 Record
是我创建的用于存储一些数据的自定义NSObject
。
我尝试将项目重命名为iBudgeter
,但它没有用。恢复到git中的先前版本确实有帮助,但是当我再次重命名它时我遇到了同样的错误。
那么有什么建议吗?
答案 0 :(得分:14)
另一种方法是修复用于NSCoding的类的名称。你只需要使用:
NSKeyedArchiver.setClassName("Record", forClass: Record.self
NSKeyedUnarchiver.setClass(Record.self, forClassName: "Record")
在任何需要的地方。
看起来iOS扩展名在类名前面加上扩展名。
答案 1 :(得分:6)
不要更改您的项目名称。只需更改显示名称即可。它是" Bundle显示名称"在Info.plist中输入。您可能需要添加条目。
如果要更改OS X应用程序的显示名称,请参阅this answer。
答案 2 :(得分:2)
如果您将文件移动到另一个模块,则需要添加其他信息
NSKeyedArchiver.setClassName("OldModule.ClassName", for: ClassName.self)
NSKeyedUnarchiver.setClass(ClassName.self, forClassName: "OldModule.ClassName")
答案 3 :(得分:0)
仅将使用NSCoding协议的ClassA重命名为ClassB之后,我仍然遇到相同的错误。
对我来说,问题是我在UserDefaults中使用了ClassA。 因此,在UserDefaults .plist中存储了旧名称ClassA。
应用程序启动时,它尝试读取.plist,并且由于名称不匹配,导致应用程序崩溃。
对我来说,解决方案只是删除用户默认设置,然后再次运行该应用程序,它可以正常工作。
要删除默认值,我在终端中使用了以下命令:
defaults delete buldle-identifier
答案 4 :(得分:0)
昨晚我遇到了这个问题。在调查3小时后,只需将“产品名称”(在“构建设置”下)更改回原始值即可对其进行排序。
答案 5 :(得分:0)
只需删除旧应用,然后再次运行对我来说就可以