查看官方的API,NSUserDefaults支持保存的数据类型有:NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary
对于,我们创建的NSObject不可以直接保存,如果调用setObject,会提示出错,信息如下:
*** -[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value ‘<Student: 0x8399f70>’ of class ‘Student’. Note that dictionaries and arrays in property lists must also contain only property values.
当保存一个Student对象时,提示我,NSUserDefaults没有这样的属性,那么如果想要保存student中的信息,可以将studnet的信息保存到一个NSDictionary中,然后获取到这个NSDictionary,再从它里面获取每一个属性;
当然这种方式弱爆了,注意一下上面保存的类型可以保存NSData类型,不防将Student类转换为NSData类型,然后
取值时再将NSData转化为Student类;
还是用代码来说明:
Student.h 代码
1: #import <Foundation/Foundation.h>
2:
3: @interface Student : NSObject <NSCoding>
4: {
5: NSString *name;
6: }
7: @property (nonatomic, retain) NSString *name;
8:
9:
10: @end
Student.m 代码
1: #import "Student.h"
2:
3: @implementation Student
4: @synthesize name;
5:
6:
7: - (void)encodeWithCoder:(NSCoder *)aCoder
8: {
9: [aCoder encodeObject:self.name forKey:@"name"];
10: }
11:
12: - (id)initWithCoder:(NSCoder *)aDecoder
13: {
14: self = [super init];
15: if (self) {
16: self.name = [aDecoder decodeObjectForKey:@"name"];
17: }
18: return self;
19: }
20:
21:
22: - (void)dealloc
23: {
24: [name release];
25: name = nil;
26: [super dealloc];
27: }
28: @end
调用的代码:
1: Student *student = [[Student alloc] init];
2: [student setName:@"Jordy"];
3:
4: NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
5:
6: NSData *studentData = [NSKeyedArchiver archivedDataWithRootObject:student];
7: [userDefault setObject:studentData forKey:@"Student"];
8: [userDefault synchronize];
9: [student release];
10:
11:
12: NSData *data = [userDefault objectForKey:@"Student"];
13: Student *stu = [NSKeyedUnarchiver unarchiveObjectWithData:data];
14: NSLog(@"stu: %@, stu.name: %@",stu,stu.name); 转自:http://mario6.diandian.com/post/2013-02-28/40049432651