NSUserDefaults簡介:
NSUserDefaults本身是一個單例后德,在整個程序中只有一個實例對象瘫想,它是數(shù)據(jù)持久化的一種方式, 使用起來也很方便
NSUserDefaults存儲的數(shù)據(jù)存在什么地方:
存儲位置為<UUID for your App>\Library\Preferences<your App's bundle ID>.plist
由于該存儲位置容易被找到,因此不建議存儲很重要或者隱私的數(shù)據(jù)(加密之后存儲除外),可以存儲一些配置信息
NSUserDefaults存儲支持哪些數(shù)據(jù)類型:
NSUserDefaults支持的數(shù)據(jù)類型有NSNumber(NSInteger喷鸽、float、double)贿堰,NSString包颁,NSDate,NSData,NSArray胞枕,NSDictionary杆煞,BOOL ,當(dāng)然NSUserDefaults雖然不能直接存儲其他類型的數(shù)據(jù), 但是我們可以把其他類型的轉(zhuǎn)成NSUserDefaults可以直接存儲的類型再進(jìn)行存儲, 下文中會提到用NSUserDefaults存儲自定義對象,會用到NSCoding
需要注意的地方:
NSUSerDefaults存儲的為不可變類型, 例如你要存儲的是一個可變的數(shù)組, 存儲之前首先用不可變數(shù)組接受一下才可以
廢話太多了,代碼走起
示例1:使用NSUserDefaults存取NSString對象(存儲其他類型的方法類似)
- (void)action1{
//存儲某人的愛好
NSString *hobby = @"LOL";
NSUserDefaults *person = [NSUserDefaults standardUserDefaults];
[person setObject:hobby forKey:@"hobby"];
//讀取某人的愛好
NSString *str = [person objectForKey:@"hobby"];
NSLog(@"某人的愛好為%@",str);
//打印結(jié)果:2016-02-17 11:04:26.075 NSUserDefaults[1497:53860] 某人的愛好為LOL
}
示例2:使用NSUserDefaults保存自定義對象
NSUserDefaults 本身不支持自定義對象的存儲,不過它支持NSData的類型, 我們可以轉(zhuǎn)一下
首先,新建一個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協(xié)議
@property (nonatomic, copy)NSString *HP;//血量
@property (nonatomic, copy)NSString *MP;//藍(lán)量
@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
//實現(xiàn)NSCoding的兩個協(xié)議方法
-(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];
//存到不可變數(shù)組中
NSArray *heroArr = [NSArray array];
heroArr = @[hanBingData,manWangData];
//存到沙盒
NSUserDefaults *heroes = [NSUserDefaults standardUserDefaults];
[heroes setObject:heroArr forKey:@"heroes"];
//讀取英雄數(shù)據(jù)
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);
}
/打印結(jié)果:
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也實現(xiàn)了把一個包含自定義對象的數(shù)組序列化到磁盤,無非就是實現(xiàn)NSCoding協(xié)議的兩個方法.
如有錯誤歡迎大家批評指正.