[数据存储] NSUserDefaults & NSKeyedArchiver

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归档.


首先自定义一个对象,实现NSCoding的两个方法。

@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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值