NSUserDefaults:
用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在。NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary、BOOL、NSURL。如果要存储其他类型,则需要转换为前面的类型,才能用NSUserDefaults存储。如果你想存储其他类型的对象,你要将其归档并创建一个NSData来实现存储。
NSUserDefaults是单例,同时也是线程安全的。
获取NSUserDefaults实例:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
存信息:
- (void)setObject:(id)value forKey:(NSString *)defaultName;
- (void)setInteger:(NSInteger)value forKey:(NSString *)defaultName;
- (void)setFloat:(float)value forKey:(NSString *)defaultName;
- (void)setDouble:(double)value forKey:(NSString *)defaultName;
- (void)setBool:(BOOL)value forKey:(NSString *)defaultName;
- (void)setURL:(NSURL *)url forKey:(NSString *)defaultName NS_AVAILABLE(10_6, 4_0);
然后通过
[userDefaults synchronize]
进行保存。
取信息:
- (id)objectForKey:(NSString *)defaultName;
- (NSString *)stringForKey:(NSString *)defaultName;
- (NSArray *)arrayForKey:(NSString *)defaultName;
- (NSDictionary *)dictionaryForKey:(NSString *)defaultName;
- (NSData *)dataForKey:(NSString *)defaultName;
- (NSArray *)stringArrayForKey:(NSString *)defaultName;
- (NSInteger)integerForKey:(NSString *)defaultName;
- (float)floatForKey:(NSString *)defaultName;
- (double)doubleForKey:(NSString *)defaultName;
- (BOOL)boolForKey:(NSString *)defaultName;
- (NSURL *)URLForKey:(NSString *)defaultName NS_AVAILABLE(10_6, 4_0);
移除某个信息:
- (void)removeObjectForKey:(NSString *)defaultName;
重置NSUserDefaults:
+ (void)resetStandardUserDefaults;
NSKeyedArchiver:
自定义对象进行归档要实现归档协议NSCoding。归档后的文件是加密的,更加安全,不可查看。归档又称为序列化encode,解归档又称为反序列化decode。
归档的第一种方法,直接对对象归档,这种方式是一个对象对应一个归档文件,显然比较浪费。
// encode
NSArray *orginalArray = @[@"string", @1, @{@"key": @"value"}];
NSString *homePath = NSHomeDirectory();
NSString *archivePath = [homePath stringByAppendingPathComponent:@"archiveFile.archive"];
[NSKeyedArchiver archiveRootObject:orginalArray toFile:archivePath];
// decode
NSArray *unarchiveArray = [NSKeyedUnarchiver unarchiveObjectWithFile:archivePath];
NSLog(@"%@", unarchiveArray);
第二种归档方式(使用NSData)。
// encode
NSString *homePath = NSHomeDirectory();
NSString *archiveFilePath = [homePath stringByAppendingPathComponent:@"archiveFile.archive"];
NSMutableData *mutableData = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:mutableData];
[archiver encodeObject:@"user_name" forKey:@"name"];
[archiver encodeFloat:23.0 forKey:@"age"];
[archiver finishEncoding];
[mutableData writeToFile:archiveFilePath atomically:YES];
// decode
NSData *data = [NSData dataWithContentsOfFile:archiveFilePath];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
float height = [unarchiver decodeFloatForKey:@"age"];
NSString *name = [unarchiver decodeObjectForKey:@"name"];
[unarchiver finishDecoding];
NSLog(@"name: %@", name);
NSLog(@"height: %f", height);
自定义的对象要支持归档,需要实现NSCoding协议
NSCoding协议有两个方法,encodeWithCoder方法对对象的数据做编码(归档)处理,initWithCoder解码(解归档)
数据来初始化对象。
实现了NSCoding协议后,就可以通过 NSKeyedArchiver归档.
@interface User : NSObject<NSCoding>
@property (strong, nonatomic) NSString *name;
@property (assign, nonatomic) NSInteger age;
@end
@implementation User
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
self.age = [aDecoder decodeIntegerForKey:@"age"];
self.name = [aDecoder decodeObjectForKey:@"name"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)coder
{
[coder encodeObject:self.name forKey:@"name"];
[coder encodeInteger:self.age forKey:@"age"];
}
然后对象归档
User *user = [[User alloc]init];
user.name = @"user_name";
user.age = 23;
NSString *homePath = NSHomeDirectory();
self.archiveFilePath = [homePath stringByAppendingPathComponent:@"archiveFile.archive"];
if ([NSKeyedArchiver archiveRootObject:user toFile:self.archiveFilePath]) {
NSLog(@"archive success.");
} else {
NSLog(@"archive failure.");
}
解归档
User *unarchiveUser = [NSKeyedUnarchiver unarchiveObjectWithFile:self.archiveFilePath];
NSLog(@"%@ :%i", unarchiveUser.name, unarchiveUser.age);
OK, Done。
所有数据存储的例子:http://download.csdn.net/detail/wanghuafeng123456/5891439