众所周知,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];  // 持久的

使用 NSUserDefaults 读取和写入自定义对象的更多相关文章

  1. NSUserDefaults读取和写入自定义对象

    NSUserDefaults可以存取一些短小的信息. 比如存入再读出一个字符串到NSUserDefaults: - NSString *string = [NSString stringWithStr ...

  2. Unity 读取、写入自定义路径文件,调用System.Windows.Forms

    调用System.Windows.Forms DLL 首先在Unity新建Plugins文件夹添加System.Windows.Forms.dll 然后代码中添加引用 using System; us ...

  3. NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象

    摘要: NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密码,网址等,NSUserDefaults肯定是首选,但是如果我们自定义了一个对象,对象保存的 ...

  4. 转-NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象

    转自:http://my.oschina.net/u/1245365/blog/294449 摘要 NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密 ...

  5. iOS开发——UI进阶篇(十一)应用沙盒,归档,解档,偏好设置,plist存储,NSData,自定义对象归档解档

    1.iOS应用数据存储的常用方式XML属性列表(plist)归档Preference(偏好设置)NSKeyedArchiver归档(NSCoding)SQLite3 Core Data 2.应用沙盒每 ...

  6. NSUserdefaults 简介以及存储自定义数据类型的方法

    一.了解NSUserDefaults以及它可以直接存储的类型 NSUserDefaults是一个单例,在整个程序中只有一个实例对象,他可以用于数据的永久保存,而且简单实用,这是它可以让数据自由传递的一 ...

  7. iOS 自定义对象及子类及模型套模型的拷贝、归档存储的通用代码

    一.runtime实现通用copy 如果自定义类的子类,模型套模型你真的会copy吗,小心有坑. copy需要自定义类继承NSCopying协议 #import <objc/runtime.h& ...

  8. IOS 如何持久化自定义对象 2014-08-01 01:38

    如果持久话自定义对象 那么这个对象一定要遵循 NSCoding 协议 并实现编解码:然后再将编解码后的数据 NSKeyedArchiver 到NSData中   @interface NSKeyAnd ...

  9. NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象 - lady-奕奕的个人空间 - 开源中国社区

    一.了解NSUserDefaults以及它可以直接存储的类型 NSUserDefaults是一个,在整个程序中只有一个实例对象,他可以用于数据的永久保存,而且简单实用,这是它可以让数据自由传递的一个前 ...

随机推荐

  1. VMware虚拟机服务的vmware-hostd自动启动和停止

    安装了虚拟机 任务管理器会出现vmware-hostd.exe  占用了80端口,导致xampp打不开,所以就想关闭vmware,解决方案如下: 开始——运行——services.msc,找到VM打头 ...

  2. IOS Android支持中文与本地文件的读取写入

    转自http://www.xuanyusong.com/archives/1069 和http://www.benmutou.com/archives/2094 前几天有个朋友问我为什么在IOS平台中 ...

  3. URLEncode编码和URLDecode解码

    String text1 = java.net.URLEncoder.encode("中国" ,"utf-8" ); String text2 = java.n ...

  4. <hdu-2032>杨辉三角

    这是杭电hdu上杨辉三角的链接:http://acm.hdu.edu.cn/showproblem.php?pid=2032  Problem Description: 还记得中学时候学过的杨辉三角吗 ...

  5. Regmon7.04绿色版(注册表变动实时监视工具)

    Regmon V7.04 简繁中文绿色版 软件大小: 155KB软件语言: 简体中文运行环境:Win9x/NT/2000/XP/2003/软件类别:国外软件 / 免费版 / 系统其它Regmon Re ...

  6. Introduction to Programming Contests (stanford)

    http://web.stanford.edu/class/cs9http://web.stanford.edu/class/cs97si/7si/

  7. List集合对象中的排序,随机显示

    List<User> students = new ArrayList<User>(); User user1 = new User(); user1.setAge(112); ...

  8. lucene 自定义评分

    摘自:http://blog.csdn.net/seven_zhao/article/details/42708953 1.基于FunctionQuery,(1)创建类并继承ValueSource:( ...

  9. C# 从零开始 vol.2

    这是第二篇 1:命名空间 命名空间可以理解成类的文件夹,这个命名空间中存放着各种类,当你需要使用到对应的类的时候,就需要导入命名空间后才能使用. 引用:可以理解成添加新的存放类的文件夹,也就是一个项目 ...

  10. 描述符和property内建函数

    首先我们搞清楚__getattr__ ,__get__ 和 __getattribute__ 作用的不同点. __getattr__在授权中会用到. __getattribute__  当要访问属性时 ...