重命名 Xcode 项目后出现 NSKeyedUnarchiver 错误
NSKeyedUnarchiver error after renaming Xcode project
我刚刚重命名了我的 Xcode 项目,当我 运行 它时我得到了这个错误:
2015-11-14 05:32:42.337 Buck Tracker[3537:1456100] * Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: '* -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (iBudgeter.Record) for key (NS.objects); the class may be defined in source code or a library that is not linked'
Buck Tracker
为新名,iBudgeter
为原名。 Record
是我为存储一些数据而创建的自定义 NSObject
。
我尝试将项目重命名回 iBudgeter
,但没有成功。在 git 中恢复到以前的版本确实有帮助,但是当我再次重命名它时我遇到了同样的错误。
有什么建议吗?
不要更改您的项目名称。只需更改显示名称即可。这是您 Info.plist 中的 "Bundle display name" 条目。您可能需要添加条目。
如果要更改 OS X 应用程序的显示名称,请参阅 。
另一种方法是修复用于 NSCoding 的 class 的名称。您只需使用:
NSKeyedArchiver.setClassName("Record", forClass: Record.self
序列化前
NSKeyedUnarchiver.setClass(Record.self, forClassName: "Record")
反序列化前
任何需要的地方。
看起来 iOS 扩展名在 class 名称前加上扩展名。
如果您将文件移动到另一个模块,则需要添加其他信息
NSKeyedArchiver.setClassName("OldModule.ClassName", for: ClassName.self)
NSKeyedUnarchiver.setClass(ClassName.self, forClassName: "OldModule.ClassName")
我只是将使用 NSCoding 协议的 ClassA 重命名为 ClassB 后出现了同样的错误。
对我来说,问题是我在我的 UserDefaults 中使用了 ClassA。
因此,UserDefaults .plist 中存储了旧名称 ClassA。
应用程序启动时尝试读取 .plist,但由于名称不匹配,应用程序崩溃了。
我的解决方案只是 删除用户默认设置并 运行 再次应用程序 并且成功了。
要删除默认值,我在终端中使用了这个命令:
defaults delete buldle-identifier
我昨晚遇到了这个问题。通过简单地将 'Product Name' (在构建设置下)更改回原始值,在 3 小时调查后对其进行了排序。
只需删除旧应用程序,运行它又对我有用
我刚刚重命名了我的 Xcode 项目,当我 运行 它时我得到了这个错误:
2015-11-14 05:32:42.337 Buck Tracker[3537:1456100] * Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: '* -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (iBudgeter.Record) for key (NS.objects); the class may be defined in source code or a library that is not linked'
Buck Tracker
为新名,iBudgeter
为原名。 Record
是我为存储一些数据而创建的自定义 NSObject
。
我尝试将项目重命名回 iBudgeter
,但没有成功。在 git 中恢复到以前的版本确实有帮助,但是当我再次重命名它时我遇到了同样的错误。
有什么建议吗?
不要更改您的项目名称。只需更改显示名称即可。这是您 Info.plist 中的 "Bundle display name" 条目。您可能需要添加条目。
如果要更改 OS X 应用程序的显示名称,请参阅
另一种方法是修复用于 NSCoding 的 class 的名称。您只需使用:
NSKeyedArchiver.setClassName("Record", forClass: Record.self
序列化前NSKeyedUnarchiver.setClass(Record.self, forClassName: "Record")
反序列化前
任何需要的地方。
看起来 iOS 扩展名在 class 名称前加上扩展名。
如果您将文件移动到另一个模块,则需要添加其他信息
NSKeyedArchiver.setClassName("OldModule.ClassName", for: ClassName.self)
NSKeyedUnarchiver.setClass(ClassName.self, forClassName: "OldModule.ClassName")
我只是将使用 NSCoding 协议的 ClassA 重命名为 ClassB 后出现了同样的错误。
对我来说,问题是我在我的 UserDefaults 中使用了 ClassA。 因此,UserDefaults .plist 中存储了旧名称 ClassA。
应用程序启动时尝试读取 .plist,但由于名称不匹配,应用程序崩溃了。
我的解决方案只是 删除用户默认设置并 运行 再次应用程序 并且成功了。
要删除默认值,我在终端中使用了这个命令:
defaults delete buldle-identifier
我昨晚遇到了这个问题。通过简单地将 'Product Name' (在构建设置下)更改回原始值,在 3 小时调查后对其进行了排序。
只需删除旧应用程序,运行它又对我有用