Renhua's Blog

Stay Hungry. Stay Foolish

0%

iOS--NSUserDefaults用法总结

NSUserDefaults原理

NSUserDefaults是iOS为我们提供的一种轻量级的本地存储方式,其工作原理非常简单,就是将数据存储到本地的plist文件中。其实建立plist文件我们自己也可以完成,只不过自己去操作文件的创建、读取等会比较麻烦,使用“NSUserDefaults”则可以完全省略掉这些步骤,只需要进行简单的读写就可以了。

NSUserDefaults支持的数据类型

因为NSUserDefaults是创建的plist类型的文件,所以它支持的数据类型也必须是plist文件能够存储的数据类型,分别是:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL。需要注意的是,就算是存储的对象是“NSArray”类型的,那也要保证“NSArray”中存储的数据必须是plist文件支持的类型。如果需要存储plist不支持的数据类型,比如说一张图片或者一个自定义对象(下文会提到),可以先将其归档为“NSDate”类型,在存储到plist文件中。

NSUserDefaults用法

NSUserDefaults是一个单例,我们可以在程序的任何地方获取到它的唯一实例化对象:

NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];

存储一个数据:

[userDefault setObject:@"测试" forKey:@"test"];

由于NSUserDefaults是隔一段时间将数据写到本地,所以为了保险起见,建议加上下面的代码,确保数据及时的存储。

[userDefault synchronize];

取出一个数据也是非常的简单:

NSString *str = [userDefault objectForKey:@"test"];

使用NSUserDefaults存储自定义对象

1.将自定义类型转换为NSDate类型

其实不建议将数据这样存储,多数据复杂类型还是建议存到数据库中,如果非要这样存储的话,可以先将自定义类型归档为NSDate类型,因为plist文件是支持存储NSDate类型数据的,然后再通过NSUserDefaults进行存储。下面举个例子:
假如我们要把书籍的对象存储起来。首先要在“.h”文件中声明“NSCoding”协议,并在“.m”文件中实现“encodeWithCoder”和“initWithCoder”两个方法。
.h文件:

//
//  Book.h
//  Book
//
//  Created by Renhuachi on 16/3/22.
//  Copyright © 2016年 software. All rights reserved.
//

#import < Foundation/Foundation.h >

@interface Book : NSObject 
#pragma mark - 属性
@property (nonatomic,copy) NSString *authorName;
@property (nonatomic,copy) NSString *bookName;

@end

.m文件

//
//  Book.m
//  Book
//
//  Created by Renhuachi on 16/3/22.
//  Copyright © 2016年 software. All rights reserved.
//

#import "Book.h"

@implementation Book

- (id)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super init]) {
        _authorName = [aDecoder decodeObjectForKey:@"authorName"];
        _bookName = [aDecoder decodeObjectForKey:@"bookName"];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeObject:_authorName forKey:@"authorName"];
    [aCoder encodeObject:_bookName forKey:@"bookName"];
}
@end

2.利用NSUserDefaults存储自定义类

首先创建一个Book类型的对象,并将其归档为NSDate类型,然后存储到NSUserDefaults中。

Book *book = [[Book alloc]init];
book.authorName = @"书名";
book.bookName = @"作者";

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:book];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:data forKey:@"book"];

从NSUserDefaults中还原数据也很简单。

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
NSdData *data = [user objectForKey:@"book"];  
Book *book = [NSKeyedUnarchiver unarchiveObjectWithData:data];