NSUserDefaults存储自定义对象
场景是这样的:
现在有一个数组如下,数组中存放着自定义的对象GoodscCategory
<__NSArrayM 0x7ffb9c2032b0>(
<GoodscCategory: 0x7ffb9c2079f0>,
<GoodscCategory: 0x7ffb9c2229e0>,
<GoodscCategory: 0x7ffb9c2217a0>,
<GoodscCategory: 0x7ffb9c222c30>,
<GoodscCategory: 0x7ffb9c21d710>,
<GoodscCategory: 0x7ffb9c21afe0>,
<GoodscCategory: 0x7ffb9c223ff0>,
<GoodscCategory: 0x7ffb9c221f80>,
<GoodscCategory: 0x7ffb9c21fcf0>,
<GoodscCategory: 0x7ffb9c224bf0>,
<GoodscCategory: 0x7ffb9c224c10>,
<GoodscCategory: 0x7ffb9c21a0e0>,
<GoodscCategory: 0x7ffb9c0a0550>
)
在尝试将该数组存储在NSUserDefaults时,发生了如下错误:
Attempt to set a non-property-list object (
"<GoodscCategory: 0x7ffb9c2079f0>",
"<GoodscCategory: 0x7ffb9c2229e0>",
"<GoodscCategory: 0x7ffb9c2217a0>",
"<GoodscCategory: 0x7ffb9c222c30>",
"<GoodscCategory: 0x7ffb9c21d710>",
"<GoodscCategory: 0x7ffb9c21afe0>",
"<GoodscCategory: 0x7ffb9c223ff0>",
"<GoodscCategory: 0x7ffb9c221f80>",
"<GoodscCategory: 0x7ffb9c21fcf0>",
"<GoodscCategory: 0x7ffb9c224bf0>",
"<GoodscCategory: 0x7ffb9c224c10>",
"<GoodscCategory: 0x7ffb9c21a0e0>",
"<GoodscCategory: 0x7ffb9c0a0550>"
) as an NSUserDefaults/CFPreferences value for key sortDataArray
经过查询,发现原因是:
NSUserDefaults支持的数据格式有:NSNumber(Integer、Float、Double),NSString,NSDate,NSArray,NSDictionary,BOOL类型,
如果想要保存其他类型或者自定义类型需要用到archiver将数据序列化为NSData类型,需要在自定义类中写encode和decode两个方法。
GoodscCategory.h
#import <Foundation/Foundation.h> @interface GoodscCategory : NSObject @property (nonatomic,copy) NSString *categoryID;
@property (nonatomic,copy) NSString *categoryName;
@property (nonatomic,retain) NSArray *subCategoryList; @end
GoodscCategory.m
@implementation GoodscCategory
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:_categoryID forKey:@"id"];
[aCoder encodeObject:_categoryName forKey:@"name"];
[aCoder encodeObject:_subCategoryList forKey:@"list"];
}
- (id)initWithCoder:(NSCoder *)aDecoder {
if (self = [super init]) {
self.categoryID = [aDecoder decodeObjectForKey:@"id"];
self.categoryName = [aDecoder decodeObjectForKey:@"name"];
self.subCategoryList = [aDecoder decodeObjectForKey:@"list"];
}
return self;
}
@end
然后在存储的时候进行序列化
- (void)saveSortArrayData:(NSArray *)array {
NSMutableArray *archiveArray = [NSMutableArray arrayWithCapacity:array.count];
for (GoodscCategory *goodsObject in array) {
NSData *goodsEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:goodsObject];
[archiveArray addObject:goodsEncodedObject];
}
NSUserDefaults *userData = [NSUserDefaults standardUserDefaults];
[userData setObject:archiveArray forKey:@"sortDataArray"];
}
取出的时候反序列化
NSArray * dataArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"sortDataArray"];
NSMutableArray *mutableArray = [[NSMutableArray alloc] init];
for (NSData *goodsData in dataArray)
{
GoodscCategory *goods = [NSKeyedUnarchiver unarchiveObjectWithData:goodsData];
[mutableArray addObject:goods];
}
这样,就实现了将数组array存入,使用的时候取出为数组mutableArray。
NSUserDefaults存储自定义对象的更多相关文章
- NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象
摘要: NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密码,网址等,NSUserDefaults肯定是首选,但是如果我们自定义了一个对象,对象保存的 ...
- NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象 - lady-奕奕的个人空间 - 开源中国社区
一.了解NSUserDefaults以及它可以直接存储的类型 NSUserDefaults是一个,在整个程序中只有一个实例对象,他可以用于数据的永久保存,而且简单实用,这是它可以让数据自由传递的一个前 ...
- 转-NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象
转自:http://my.oschina.net/u/1245365/blog/294449 摘要 NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密 ...
- java 16 -11 ArrayList存储自定义对象并增强for遍历
需求:ArrayList存储自定义对象并遍历.要求加入泛型,并用增强for遍历. A:迭代器 B:普通for C:增强for LinkedList,Vector,Colleciton,List ...
- Java基础知识强化之集合框架笔记46:Set集合之TreeSet存储自定义对象并遍历练习2(自然排序:Comparable)
1. TreeSet存储自定义对象并遍历练习2: (1)Student.java package cn.itcast_06; /* * 如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口 * ...
- Java基础知识强化之集合框架笔记45:Set集合之TreeSet存储自定义对象并遍历练习1(自然排序:Comparable)
1. 自然排序: TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合元素按照升序排列,这种方式就是自然排序. Java中提供了一个Comp ...
- Java基础知识强化之集合框架笔记41:Set集合之HashSet存储自定义对象并遍历练习
1. HashSet集合存储自定义对象并遍历.如果对象的成员变量值相同即为同一个对象 注意了: 你使用的是HashSet集合,这个集合的底层是哈希表结构. 而哈希表结构底层依赖:hashCode()和 ...
- Java基础知识强化之集合框架笔记40:Set集合之HashSet存储自定义对象并遍历
1. HashSet存储自定义对象并遍历 2. 代码示例: (1)Student类,如下: package cn.itcast_02; /** * @author Administrator * */ ...
- Java基础知识强化之集合框架笔记24:ArrayList存储自定义对象并遍历
1. ArrayList存储自定义对象并遍历 2. 代码示例: Student.java,如下: package cn.itcast_01; public class Student { privat ...
随机推荐
- Python 3学习笔记2
模块: 模块是一个包含Python代码的文本文件.使用import可以将模块导入到其他程序中. 每个模块都有自己的命名空间.主Python程序中的代码与一个名为__main__的明明空间关联.将代码放 ...
- 更新插件时提示“正在更新缓存”“正在等待jockey-backend退出”
Ubuntu 11 更新语言插件, 更新时 提示正在更新缓存”“正在等待jockey-backend退出”,然后就不动了. 解决方案: 在终端中键入ps -e | grep jockey 系统会显示一 ...
- jQuery提交Json数据到Webservice,并接收返回的Json数据
jQuery ajax webservice:get 和 post 一.GET 方式 客户端 复制代码 代码如下: var data = { classCode: "0001"}; ...
- 手机调用系统的拍照和裁剪功能,假设界面有输入框EditText,在一些手机会出现点击EditText会弹出输入法,却不能输入的情况。
1. 拍照裁剪后 点击EditText会弹出输入法,却不能输入.可是点击点一EdtiText就能够输入了,所以我就写了一个看不见的EdtiText,切换焦点,这样就攻克了这个奇怪的这问题,应该是and ...
- Html+jquery mobile
打开VS 2013,选择[文件]-[新建]-[项目] 选择框架为.NET Framework4-[ASP.NET MVC4 Web应用程序],点击[确定] 选择[基本],点击[确定] 创建的MVC的项 ...
- 项目源码--Android应用商店源码
下载源码 技术要点: 1.互联网应用 客户端框架 2.综合应用开发所 有技术 3.安装应用的管理 4. HTTP网络通信技 术 5.下载安装.评论 框架 6.使用.版本升级 等统计方案 7.源 ...
- QTP自学攻略
QTP自学攻略 自学总是很痛苦的,看大量的书籍,可是学到的东西却不是那么实用,下面整理了一些在QTP中经常需要的函数,以及方法很实用! QTP常用函数 1, 获取对话框相应的文字: GetVisi ...
- Football
Football Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2882 Accepted: 1466 Descript ...
- TCP/IP协议原理与应用笔记18:构成子网和超网
1. 引言: (1)类别IP编址(Classful IP)的缺陷 • 固定的3种IP网络规模 C类地址:少于255台主机的网络 B类地址:介于255~65535台主机的网络 ...
- myeclipse web 包名保留字与servlet冲突
包名不能取modify ..........等保留字 不能有数字