如果需要使用UserDefault归解档,正确的使用方式可以参考如下文章:
http://nshipster.com/nscoding/
问题描述
1、之前使用的项目,只有一个模块,也是主模块,使用UserDefault保存归档解档的信息没有任何问题(其实跟Userdefault关系)
2、归档接档的是自己自定义的对象
3、项目后面需要将每个模块单独提取出去,比如交易模块,用户模块,提取之后,运行项目,归解档就崩溃
大致就是找不到需要接档的对象
ios - -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class
从详细错误信息中可以了解到
使用模块,或者更改项目名称之后,反序列化解码经常找不到key对应的对象,可以在设置class的时候,加上报错信息的key。比如我的为Projec.USTradeAccountModel。
代码如下:(需要的信息自行替换)
归档需要
NSKeyedArchiver.setClassName("ProjectName.USTradeAccountModel", for: USTradeAccountModel.self)
NSKeyedArchiver.setClassName("ProjectName.USSecAccountTickerType", for: USSecAccountTickerType.self) // 如果自定义对象中包含子对象,也需要进行设置
NSKeyedArchiver.setClassName("ProjectName.USBrokerTradePermission", for: USBrokerTradePermission.self)
接档需要
NSKeyedUnarchiver.setClass(USTradeAccountModel.self, forClassName: "ProjectName.USTradeAccountModel")
NSKeyedUnarchiver.setClass(USSecAccountTickerType.self, forClassName: "ProjectName.USSecAccountTickerType")
NSKeyedUnarchiver.setClass(USBrokerTradePermission.self, forClassName: "ProjectName.USBrokerTradePermission")
看到另一种简洁的说法
如果存储的对象类名有变动,则需要设置clasName, 方法为:“setClassName:forClass:”
使用 NSKeyedArchiver 进行数据持久化时, 系统会默认使用类名去建表,如果类名变了,那么使用新的类名肯定是从本地获取不到表的,代码执行崩溃。
所以需要在 NSKeyedArchiver 或者 NSKeyedUnarchiver 时使用 “setClassName:forClass:” 指定类名。