ios程序员iOS Developer

NSUserDefaults,NSCoding的使用

2016-02-17  本文已影响905人  yyMae

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协议的两个方法.

如有错误欢迎大家批评指正.

上一篇下一篇

猜你喜欢

热点阅读