一直木有看过这个细节,用UserDefaults是能不能存复杂一点的对象。大家可能都看到过UserDefaults的一个方法setObject: forKey:
,用这个方法存过NSDictionary
,NSArray
什么的,也存过字符串。
偶然一次直接存了一个继承自JSONModel
的实体类,然后就悲剧了。后来查了下苹果的文档:
The value parameter can be only property list objects: NSData, NSString,
NSNumber, NSDate, NSArray, or NSDictionary. For NSArray and NSDictionary objects,
their contents must be property list objects.
简单来说就是setObject:forKey:
方法可以存NSData
,NSString
什么的对象,即使是NSDictionary
和NSArray
内存放的元素也必须是property list objects的。具体什么是property list object看这里。关于JSONModel
可以看这里,还不错。
既然苹果的API已经限制到这个地步了再想别的已经玩不出什么花样了。是的,你可以存文件。不过这里说的还是用UserDefaults嘛。
解决这个问题的核心思想就是把一个对象转换为NSData
,或者说是序列化为NSData
。序列化的说法不一定准确但是存在这样的一个过程,具体的后面再细说。当一个对象可以转化为NSData
了也就适用NSUserDefaults
的方法setObject: forKey:
了。也就是这样的用法:
//假设有一个用户实体类
class UserModel {
var userId: Strin