NSUserDefaults,NSCoding的使用
NSUserDefaults简介:
NSUserDefaults本身是一个单例,在整个程序中只有一个实例对象,它是数据持久化的一种方式, 使用起来也很方便
NSUserDefaults存储的数据存在什么地方:
存储位置为<UUID for your App>\Library\Preferences<your App's bundle ID>.plist
由于该存储位置容易被找到,因此不建议存储很重要或者隐私的数据(加密之后存储除外),可以存储一些配置信息
NSUserDefaults存储支持哪些数据类型:
NSUserDefaults支持的数据类型有NSNumber(NSInteger、float、double),NSString,NSDate,NSData,NSArray,NSDictionary,BOOL ,当然NSUserDefaults虽然不能直接存储其他类型的数据, 但是我们可以把其他类型的转成NSUserDefaults可以直接存储的类型再进行存储, 下文中会提到用NSUserDefaults存储自定义对象,会用到NSCoding
需要注意的地方:
NSUSerDefaults存储的为不可变类型, 例如你要存储的是一个可变的数组, 存储之前首先用不可变数组接受一下才可以
废话太多了,代码走起
示例1:使用NSUserDefaults存取NSString对象(存储其他类型的方法类似)
- (void)action1{
//存储某人的爱好
NSString *hobby = @"LOL";
NSUserDefaults *person = [NSUserDefaults standardUserDefaults];
[person setObject:hobby forKey:@"hobby"];
//读取某人的爱好
NSString *str = [person objectForKey:@"hobby"];
NSLog(@"某人的爱好为%@",str);
//打印结果:2016-02-17 11:04:26.075 NSUserDefaults[1497:53860] 某人的爱好为LOL
}
示例2:使用NSUserDefaults保存自定义对象
NSUserDefaults 本身不支持自定义对象的存储,不过它支持NSData的类型, 我们可以转一下
首先,新建一个LOL英雄的类Hero
//
// Hero.h
// NSUserDefaults
//
// Created by yyMae on 16/2/17.
// Copyright © 2016年 yyMae. All rights reserved.
// 定义一个LOL英雄类
#import <Foundation/Foundation.h>
@interface Hero : NSObject<NSCoding>//遵循NSCoding协议
@property (nonatomic, copy)NSString *HP;//血量
@property (nonatomic, copy)NSString *MP;//蓝量
@property (nonatomic, copy)NSString *SP;//怒气
@end
//
// Hero.m
// NSUserDefaults
//
// Created by yyMae on 16/2/17.
// Copyright © 2016年 yyMae. All rights reserved.
//
#import "Hero.h"
@implementation Hero
//实现NSCoding的两个协议方法
-(instancetype)initWithCoder:(NSCoder *)aDecoder{
self = [super init];
if (self) {
self.HP = [aDecoder decodeObjectForKey:@"HP"];
self.MP = [aDecoder decodeObjectForKey:@"MP"];
self.SP = [aDecoder decodeObjectForKey:@"SP"];
}
return self;
}
-(void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.HP forKey:@"HP"];
[aCoder encodeObject:self.MP forKey:@"MP"];
[aCoder encodeObject:self.SP forKey:@"SP"];
}
@end
然后,看下面具体操作,其实很easy
- (void)action2{
//初始化两个英雄:寒冰和蛮王(他俩是两口子)
Hero *hanBing = [[Hero alloc]init];
hanBing.HP = @"400";
hanBing.MP = @"200";
hanBing.SP = @"0";
Hero *manWang = [[Hero alloc]init];
manWang.HP = @"420";
manWang.MP = @"0";
manWang.SP = @"50";
//用NSData接收
NSData *hanBingData = [NSKeyedArchiver archivedDataWithRootObject:hanBing];
NSData *manWangData = [NSKeyedArchiver archivedDataWithRootObject:manWang];
//存到不可变数组中
NSArray *heroArr = [NSArray array];
heroArr = @[hanBingData,manWangData];
//存到沙盒
NSUserDefaults *heroes = [NSUserDefaults standardUserDefaults];
[heroes setObject:heroArr forKey:@"heroes"];
//读取英雄数据
NSArray *array = [heroes objectForKey:@"heroes"];
for (NSData *heroData in array) {
Hero hero = [NSKeyedUnarchiver unarchiveObjectWithData:heroData];
NSLog(@"HP:%@ MP:%@ SP:%@",hero.HP,hero.MP,hero.SP);
}
/打印结果:
2016-02-17 12:06:15.005 NSUserDefaults[2192:85145] HP:400 MP:200 SP:0
2016-02-17 12:06:15.005 NSUserDefaults[2192:85145] HP:420 MP:0 SP:50
*/
}
示例2也实现了把一个包含自定义对象的数组序列化到磁盘,无非就是实现NSCoding协议的两个方法.
如有错误欢迎大家批评指正.