NSUserDefaults适合存储轻量级的本地数据。
如用户信息,下次登录时候,就可以直接读取本地信息显示到页面,不用再次输入。
如果是自定义对象,则不可以直接存储。
一、NSUserDefaults以及存储类型
NSUserDefaults是一个单例,在整个程序中只有一个实例对象。
NSUserDefaults作为iOS数据存储方式的一种,是操作起来较为简单的方式。但是也有其局限性,就是存储类型有限,
支持以下数据类型:
NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL.
如果需要将以上的数据类型永久保存到NSUserDefaults中,只需要一个简单的操作。如存储一个NSString的数值:
NSString *name = @"wxx";
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
[ud setObject:name forKey:@"name"];
将数据取出也特别简单:
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
NSString *name = [ud objectForKey:@"name"];
PS:每次使用相同的key存储,都会覆盖原有的数据。
二、存储可变数据
NSUserDefaults存储对象是不可变的。想要存入可变,需要先转为不可变对象。即如果想要存储一个NSMutabelArray对象,
需要创建一个NSArray,将NSMutabelArray赋给,最后将NSArray存入NSUserDefaults中去。如下:
NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"one",@"two",@"three", nil];
NSArray *array = [NSArray arrayWithArray:mArray];
NSUserDefaults*ud = [NSUserDefaults standardUserDefaults];
[ud setObject:array forKey:@"存储不可变"];
接收数据也一样,如果需要将数据接收给可变数据,需要先用不可变数组获取,再赋给可变数据。
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
NSMutableArray *mArr;
NSArray *arr = [ud objectForKey:@"存储不可变的数据类型"];
mArr = [NSMutableArray arrayWithArray:arr];
[arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL *stop) {
NSLog(@"%@",obj);
}];
三、存储自定义对象
前面提到,NSUserDefaults存储的几种数据类型,不包括自定义对象。所以,如果想要存储自定义对象,
需要将自定义对象转化为NSData,即可存储。暂时没去理解归档的做法,这里先略过。
下面直接给出例子。
自定义User对象,包括name,age两个属性:
#import <Foundation/Foundation.h>
//遵循NSCoding协议,需要在.m文件中实现两个方法:
// encodeWithCoder和initWithCoder
@interface User : NSObject<NSCoding>
@property(nonatomic,strong)NSString *name;
@property(nonatomic,assign)NSInteger age;
@end
#import "User.h"
@implementation User
-(void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:[NSNumber numberWithInteger:self.age] forKey:@"age"];
[aCoder encodeObject:self.name forKey:@"name"];
}
-(id)initWithCoder:(NSCoder *)aDecoder{
if (self = [super init]) {
self.age = [[aDecoder decodeObjectForKey:@"age"]integerValue];
self.name = [aDecoder decodeObjectForKey:@"name"];
}
return self;
}
@end
通过两个按钮的点击事件,模拟存储数据和获取数据:
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
#import "ViewController.h"
#import "User.h"
@interface ViewController (){
NSUserDefaults *ud;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (IBAction)save:(UIButton *)sender {
// 将自定义类型存入NSUserDefaults
User *user = [[User alloc]init];
user.name = @"wxx";
user.age = 23;
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:user];
ud = [NSUserDefaults standardUserDefaults];
[ud setObject:data forKey:@"user1"];
}
- (IBAction)get:(UIButton *)sender {
// 获取自定义类型的数据
ud = [NSUserDefaults standardUserDefaults];
NSData *data = [ud objectForKey:@"user1"];
User *user = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSLog(@"name = %@,age = %ld",user.name,(long)user.age);
//打印结果:2015-11-24 17:21:23.442 MyNSUserDefaultsDemo[16276:2562711] name = wxx,age = 23
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
参考:http://my.oschina.net/u/1245365/blog/294449