decodeObjectForKey崩溃小结

2022-08-23  本文已影响0人  对酒当歌的夜

项目使用一个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就好了

上一篇 下一篇

猜你喜欢

热点阅读