NSKeyedUnarchiver.unarchiveObjectWithFile 在加载从不同目标创建的 类 时崩溃
NSKeyedUnarchiver.unarchiveObjectWithFile crashes when loading classes created from a different target
我有一个 PLIST 文件,它是使用应用程序的生产版本创建的,并作为资源添加到项目中。生产版本的目标名称是"little pony"。为了帮助应用程序测试,在同一项目下通过不同的目标构建了另一个版本 "little pony beta"。
在运行时,测试版应用程序尝试加载 PLIST 并崩溃并显示消息:
Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (little pony.Layer) for key (NS.objects); the class may be defined in source code or a library that is not linked'
看来,PLIST 应该包含 little pony beta.Layer
而不是 little pony.Layer
class 才能使加载成功。
有什么方法可以让 NSKeyedUnarchiver.unarchiveObjectWithFile
使用不同的命名空间来让它工作吗?当然,我不想创建两组不同的预编译数据,因为这是 CPU 密集型任务。
我在这里找到了解决方案:
解决方案建议使用
更改NSCoding的class名称
[NSKeyedUnarchiver setClass:[Layer self] forClassName:@"little pony beta.Layer"];
我有一个 PLIST 文件,它是使用应用程序的生产版本创建的,并作为资源添加到项目中。生产版本的目标名称是"little pony"。为了帮助应用程序测试,在同一项目下通过不同的目标构建了另一个版本 "little pony beta"。 在运行时,测试版应用程序尝试加载 PLIST 并崩溃并显示消息:
Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (little pony.Layer) for key (NS.objects); the class may be defined in source code or a library that is not linked'
看来,PLIST 应该包含 little pony beta.Layer
而不是 little pony.Layer
class 才能使加载成功。
有什么方法可以让 NSKeyedUnarchiver.unarchiveObjectWithFile
使用不同的命名空间来让它工作吗?当然,我不想创建两组不同的预编译数据,因为这是 CPU 密集型任务。
我在这里找到了解决方案:
解决方案建议使用
更改NSCoding的class名称[NSKeyedUnarchiver setClass:[Layer self] forClassName:@"little pony beta.Layer"];