众所周知,NSUserDefaults只能保存诸如NSArray、NSDictionary、NSData、NSNumber等基本数据类型,如果我们强制保存自定义的类,就会出现这个错误:Attempt to set a non-property-list object as an NSUserDefaults value for ,解释起来:【试图将一个非属性列表对象设置为 NSUserDefaults】接下来就说说如何吧自定义的对象保存到NSUserDefaults中去。

自定义的类实现<NSCoding>协议中的- (id) initWithCoder: (NSCoder *)coder方法和- (void) encodeWithCoder: (NSCoder *)coder方法

#pragma mark NSCoding

- (id)initWithCoder:(NSCoder *)aDecoder{  // 解码

if (self == [super init]) {

alias = [aDecoder decodeObjectForKey:JSON_NAME];

mobile = [aDecoder decodeObjectForKey:JSON_MOBILE];

signtime = [[aDecoder decodeObjectForKey:JSON_TIMESTAMP] longValue];

endtime = [[aDecoder decodeObjectForKey:JSON_END_TIME] longValue];

cmobile = [aDecoder decodeObjectForKey:JSON_CMOBILE];

}

return self;

}

- (void)encodeWithCoder:(NSCoder *)aCoder{  // 编码

[aCoder encodeObject:alias forKey:JSON_NAME];

[aCoder encodeObject:mobile forKey:JSON_MOBILE];

[aCoder encodeObject:[NSNumber numberWithLong:signtime] forKey:JSON_TIMESTAMP];

[aCoder encodeObject:[NSNumber numberWithLong:endtime] forKey:JSON_END_TIME];

[aCoder encodeObject:cmobile forKey:JSON_CMOBILE];

}

保存到NSUSerDefault:

Terminal *terminal = [[Terminal alloc] init];

terminal.alias = [dict objectForKey:JSON_NAME];

terminal.mobile = [dict objectForKey:JSON_MOBILE];

terminal.signtime = [[dict objectForKey:JSON_TIMESTAMP] longValue];

terminal.endtime = [[dict objectForKey:JSON_END_TIME] longValue];

terminal.cmobile = [dict objectForKey:JSON_CMOBILE];

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:terminal];

[userDefaults setObject:data forKey:"test"];

[userDefaults synchronize];

也就是说,我们保存自定义对象时,是使用NSKeyedArchiver 把数据归档为NSData对象,然后把NSData存储到UserDefault中,NSData相当于Model

读取:

NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];

NSData *data =  [userDefaults objectForKey:"test"];

return [NSKeyedUnarchiver unarchiveObjectWithData:data];

读取自定义对象时,先获取到NSData,然后使用NSKeyedUnarchiver解档为自定义的对象

LOG输出,查看结果:

2014-12-10 16:31:11.815 ESO_Etws[1463:60b] alias:Q611-0334

2014-12-10 16:31:11.815 ESO_Etws[1463:60b] mobile:13841040334

2014-12-10 16:31:11.815 ESO_Etws[1463:60b] signtime:1394529151000

2014-12-10 16:31:11.816 ESO_Etws[1463:60b] endtime:1426065151000

2014-12-10 16:31:11.816 ESO_Etws[1463:60b] cmobile:

PS:

APP升级后,UserDefaults中原有的plist是不会删除的,除非用户卸载APP

清除整个UserDefaults数据的方法:

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];  // 持久的

最新文章

  1. 未能正确加载包“Microsoft.Data.Entity.Design.Package.MicrosoftDataEntityDesignPackage
  2. 【java】spring-data-jpa 集成hibernate实现多条件分页查询
  3. AC日记——信息传递 洛谷 P2661 (tarjan求环)
  4. 【bzoj1562】 NOI2009—变换序列
  5. lucene 使用注意
  6. 数学类杂志SCI2013-2014影响因子
  7. Centos7架设NMP服务器笔记
  8. php 不能取得session值的一个解决方法
  9. LGTB 与大数
  10. Linux系统mysql使用(一)
  11. 解析ArcGis的字段计算器(一)——数值型数据计算,从“面积计算”开始
  12. Java基础(basis)-----异常与错误处理
  13. Git安装与使用
  14. TCP滑动窗口
  15. 表格行与列mouse经过时高亮显示
  16. SuperMap开发入门2——环境部署
  17. 初次使用git上传代码(转)
  18. [微信小程序]微信开发工具出现 1not found 编译 .wxss文件信息错误怎么办?
  19. CenOS6.5下源码安装vim-7.4
  20. 发送邮件 html格式

热门文章

  1. js得到当前页面的url信息方法
  2. ToString() 格式化
  3. WinForm 进程和线程
  4. vsftp建立虚拟用户不同目录分配不同权限操作步骤详解
  5. 浅谈Objective-C对象初始化的三类程序猿
  6. 蓝桥杯—盾神与条状项链(C++实现)
  7. 运用bootstrap框架的时候 引入文件的问题
  8. linux下svn目录管理
  9. Java web项目综合练习(Estore)
  10. Mac笔记本中使用postgresql