尝试用NSUserDefaults存储自定义的类型时报错“Thread 1: "Attempt to insert non-property list objec xxx for key xx”,经过查询发现NSUserDefaults支持的数据格式主要有:Integer、Float、Double、NSString、NSDate、NSArray、NSDictionary、BOOL等类型,如果想要存储其他类型或者自定义的类型时需要对数据进行序列化和反序列化。
完整示例代码
1.定义一个继承自NSObject的model类,声明变量函数,并重写encode和decode两个方法
//.h文件实现
#import <Foundation/Foundation.h>
@interface myModel : NSObject
//自定义的两个参数
@property (nonatomic,strong) NSString *aStr;
@property (nonatomic,strong) NSString *bStr;
//.m文件实现
#import "myModel.h"
@implementation myModel
- (instancetype)init
{
self = [super init];
if (self)
{
_ aStr = @"";
_ bStr = @"";
}
return self;
}
//重写encode和decode两个方法
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:_aStr forKey:@"aStr"];
[aCoder encodeObject:_bStr forKey:@"bStr"];
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super init])
{
self. aStr = [aDecoder decodeObjectForKey:@"aStr"];
self. bStr = [aDecoder decodeObjectForKey:@"bStr"];
}
return self;
}
2.在VC.m中实现存储和取值
//.m文件实现
//存储数据
/**
*这里假设一个字典数据为dataDic{@"aStr":@"1",@"bStr":@"2"},可以根据自己的实际情况去确定层级结构
*/
//定义一个数组用来存储
NSMutableArray *defaultArr = [NSMutableArray new];
myModel *model = [myModel new];
model.aStr = [dataDic objectForKey:@"aStr"];
model.bStr = [dataDic objectForKey:@"bStr"];
//先将model序列化在存储
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:model];
[defaultArr addObject: data];
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
[userDefault setObject: defaultArr forKey:@“KEY”];
//.m文件中实现
//取值
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
//获取存储数据
NSArray *defaultArr = [userDefault objectForKey:@“KEY”];
//定义数组用于接收反序列化后的数据
NSMutableArray *dataArr = [[NSMutableArray alloc] init];
for (NSData *data in defaultArr)
{
//反序列化
myModel *model = [NSKeyedUnarchiver unarchiveObjectWithData: data];
[dataArr addObject:model];
}
网友评论