项目使用一个oldMD,并且encodeObject操作归档保存了。然后切换分支后没有oldMD,还进行decodeObjectForKey操作解档,然后就崩溃了,类似场景就是使用一个模型归档保存后面删除这个模型了,旧的数据跑在没有那个模型的代码上就会出现这个崩溃。如下:
[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (oldMD) for key (oldMD) because no class named \"oldMD\" was found; the class needs to be defined in source code or linked in from a library (ensure the class is part of the correct target). If the class was renamed, use setClassName:forClass: to add a class translation mapping to NSKeyedUnarchiver"
//这个报错也一样
[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (XXXX) for key (NS.objects); the class may be defined in source code or a library that is not linked"
一通研究发现解决办法
1.直接卸载重新安装即可
这种出现概率也小一般人不用处理。
2.在decodeObjectForKey时候使用try。
这样就不会崩溃,也是会报错,全局断点也会走只是不崩溃。
@try {
xx = [unarchive decodeObjectForKey:@"me"];
}
@catch (NSException *exception) {
NSLog(@"出现错误==%@", exception);
}
@finally {
}
3.不要删除旧的
测试发现全局的只要是存在oldMD就不会崩,当然不能全部注释。旧的模型经过归档的不要随便删除,可以多个版本以后在删除。
4.设置对应名称
在之前添加这个[unarchive setClass:[newMD class] forClassName:@"oldMD"];//newMD其他已知的存在的模型
有点废话,如果知道这里会崩也不用这样处理,建议使用2-3操作。
全部的加上try不知道数据大调用多了会不会影响性能,如果跟字典一样能判断里面是否包含这个key就好了