NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名、密码之类的;
NSUserDefaults被设计用来存储设备和应用的配置信息,它通过一个工厂方法返回默认的、也是最常用到的实例对象。这个对象中储存了系统中用户的配置信息,开发者可以通过这个实例对象对这些已有的信息进行修改,也可以按照自己的需求创建新的配置项。
NSUserDefaults把配置信息以字典的形式组织起来,支持字典的项包括:字符串或者是数组,除此之外还支持数字等基本格式。一句话概括就 是:基础类型的小数据的字典。操作方法几乎与NSDictionary的操作方法无异,另外还可以通过指定返回类型的方法获取到指定类型的返回值。
在这需要着重介绍下 保存 自定义对象类型
假如简单的将自定义对象放入NSUserdefaults 中去存储是不会成功,我们需要转换下思路,我们需要将对象转换成NSData,再去存储
简单的说就是自定义对象需要实现NSConding 协议,并且实现两个方法,分别是 encodeWithCoder和 initWithCoder
下面看代码吧
1 文件结构
// // WPUser.h // OC-NSUserDefaults // // Created by wangtouwang on 15/4/8. // Copyright (c) 2015年 wangtouwang. All rights reserved. // #import <Foundation/Foundation.h> @interface WPUser : NSObject<NSCoding> @property NSString *account; @property NSString *paw; @end // // WPUser.m // OC-NSUserDefaults // // Created by wangtouwang on 15/4/8. // Copyright (c) 2015年 wangtouwang. All rights reserved. // #import "WPUser.h" @implementation WPUser -(void)encodeWithCoder:(NSCoder *)aCoder{ [aCoder encodeObject:self.account forKey:@"account"]; [aCoder encodeObject:self.paw forKey:@"paw"]; } -(id)initWithCoder:(NSCoder *)aDecoder{ if (self = [super init]) { self.account = [aDecoder decodeObjectForKey:@"account"]; self.paw = [aDecoder decodeObjectForKey:@"paw"]; } return self; } @end
// // TurnViewController.h // OC-NSUserDefaults // // Created by wangtouwang on 15/4/8. // Copyright (c) 2015年 wangtouwang. All rights reserved. // #import <UIKit/UIKit.h> @interface TurnViewController : UIViewController -(void)saveData:(UIButton *)btn; @end // // TurnViewController.m // OC-NSUserDefaults // // Created by wangtouwang on 15/4/8. // Copyright (c) 2015年 wangtouwang. All rights reserved. // #import "TurnViewController.h" #import "WPUser.h" @interface TurnViewController () //保存字符串数据 @property(nonatomic,strong) UILabel *stringLable; @property(nonatomic,strong) UITextField *stringTextFile; //保存NSNumber类型 @property(nonatomic,strong) UILabel *numberLable; @property(nonatomic,strong) UITextField *numberField; //保存日期类型 @property(nonatomic,strong) UILabel *dateLable; @property(nonatomic,strong) UITextField *dateField; //保存数组类型 @property(nonatomic,strong) UILabel *arrayLable; @property(nonatomic,strong) UITextField *array_ALable; @property(nonatomic,strong) UITextField *array_BLable; //保存集合类型 @property(nonatomic,strong) UILabel *dicLable; @property(nonatomic,strong) UITextField *dic_ALable; @property(nonatomic,strong) UITextField *dic_BLable; //保存BOOL类型 @property(nonatomic,strong) UILabel *boolLable; @property(nonatomic,strong) UITextField *boolField; //保存对象类型 //保存按钮 然后跳转 @property(nonatomic,strong) UIButton *viewButton; @end @implementation TurnViewController - (void)viewDidLoad { [super viewDidLoad]; [self.view setBackgroundColor:[UIColor grayColor]]; self.stringLable = [[UILabel alloc] initWithFrame:CGRectMake(10, 100, 180, 25)]; self.stringLable.text=@"保持字符串数据"; self.stringLable.font = [UIFont fontWithName:@"Helvetica" size:12]; self.stringTextFile=[[UITextField alloc] initWithFrame:CGRectMake(115, 100, 180, 25)]; self.stringTextFile.borderStyle=UITextBorderStyleRoundedRect; self.stringTextFile.font= [UIFont fontWithName:@"Helvetica" size:12]; [self.view addSubview:self.stringLable]; [self.view addSubview:self.stringTextFile]; self.numberLable = [[UILabel alloc] initWithFrame:CGRectMake(10, 130, 180, 25)]; self.numberLable.text=@"保持数值类型"; self.numberLable.font = [UIFont fontWithName:@"Helvetica" size:12]; self.numberField=[[UITextField alloc] initWithFrame:CGRectMake(115, 130, 180, 25)]; self.numberField.borderStyle=UITextBorderStyleRoundedRect; self.numberField.font= [UIFont fontWithName:@"Helvetica" size:12]; [self.view addSubview:self.numberLable]; [self.view addSubview:self.numberField]; self.dateLable = [[UILabel alloc] initWithFrame:CGRectMake(10, 160, 180, 25)]; self.dateLable.text=@"保持日期类型"; self.dateLable.font = [UIFont fontWithName:@"Helvetica" size:12]; self.dateField=[[UITextField alloc] initWithFrame:CGRectMake(115, 160, 180, 25)]; self.dateField.borderStyle=UITextBorderStyleRoundedRect; self.dateField.font= [UIFont fontWithName:@"Helvetica" size:12]; [self.view addSubview:self.dateLable]; [self.view addSubview:self.dateField]; self.arrayLable = [[UILabel alloc] initWithFrame:CGRectMake(10, 190, 180, 25)]; self.arrayLable.text=@"保持数组类型"; self.arrayLable.font = [UIFont fontWithName:@"Helvetica" size:12]; self.array_ALable=[[UITextField alloc] initWithFrame:CGRectMake(115, 190, 180, 25)]; self.array_ALable.borderStyle=UITextBorderStyleRoundedRect; self.array_ALable.font= [UIFont fontWithName:@"Helvetica" size:12]; self.array_BLable=[[UITextField alloc] initWithFrame:CGRectMake(115, 220, 180, 25)]; self.array_BLable.borderStyle=UITextBorderStyleRoundedRect; self.array_BLable.font= [UIFont fontWithName:@"Helvetica" size:12]; [self.view addSubview:self.arrayLable]; [self.view addSubview:self.array_ALable]; [self.view addSubview:self.array_BLable]; self.dicLable = [[UILabel alloc] initWithFrame:CGRectMake(10, 250, 180, 25)]; self.dicLable.text=@"保持集合类型"; self.dicLable.font = [UIFont fontWithName:@"Helvetica" size:12]; self.dic_ALable=[[UITextField alloc] initWithFrame:CGRectMake(115, 250, 180, 25)]; self.dic_ALable.borderStyle=UITextBorderStyleRoundedRect; self.dic_ALable.font= [UIFont fontWithName:@"Helvetica" size:12]; self.dic_BLable=[[UITextField alloc] initWithFrame:CGRectMake(115, 280, 180, 25)]; self.dic_BLable.borderStyle=UITextBorderStyleRoundedRect; self.dic_BLable.font= [UIFont fontWithName:@"Helvetica" size:12]; [self.view addSubview:self.dicLable]; [self.view addSubview:self.dic_ALable]; [self.view addSubview:self.dic_BLable]; self.boolLable = [[UILabel alloc] initWithFrame:CGRectMake(10, 310, 180, 25)]; self.boolLable.text=@"保持布尔类型"; self.boolLable.font = [UIFont fontWithName:@"Helvetica" size:12]; self.boolField=[[UITextField alloc] initWithFrame:CGRectMake(115, 310, 180, 25)]; self.boolField.borderStyle=UITextBorderStyleRoundedRect; self.boolField.font= [UIFont fontWithName:@"Helvetica" size:12]; [self.view addSubview:self.boolLable]; [self.view addSubview:self.boolField]; self.viewButton = [[UIButton alloc] initWithFrame:CGRectMake(80, 340, 100, 25)]; self.viewButton.backgroundColor=[UIColor redColor]; [self.viewButton setTitle:@"保存" forState:UIControlStateNormal]; [self.viewButton.layer setCornerRadius:10.0]; //设置矩形四个圆角半径 [self.view addSubview:self.viewButton]; [self.viewButton addTarget:self action:@selector(saveData:) forControlEvents:UIControlEventTouchUpInside]; } -(void)saveData:(UIButton *)btn{ NSLog(@"准备保存数据"); //通过NSUserDefaults保存数据 NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; //保存字符串类型 [ud setObject:self.stringTextFile.text forKey:@"string"]; //保存数值类型 [ud setInteger:self.numberField.text.intValue forKey:@"number"]; //保存日期类型 NSDateFormatter *format = [[NSDateFormatter alloc] init]; format.dateFormat=@"yy-MM-dd HH:mm"; [ud setObject:[NSDate date] forKey:@"date"]; //保存数组类型 NSArray *array = [[NSArray alloc] initWithObjects:self.array_ALable.text,self.array_BLable.text, nil]; [ud setObject:array forKey:@"array"]; //保存集合类型 NSMutableDictionary *md = [[NSMutableDictionary alloc] initWithObjectsAndKeys:nil]; [md setObject:self.dic_ALable.text forKey:@"dicA"]; [md setObject:self.dic_BLable.text forKey:@"dicB"]; [ud setObject:md forKey:@"dictionary"]; [ud setBool:YES forKey:@"BOOL"]; //保存对象类型 WPUser *user = [[WPUser alloc] init]; user.account = @"zhangjie"; user.paw=@"123"; NSData *udObject = [NSKeyedArchiver archivedDataWithRootObject:user]; [ud setObject:udObject forKey:@"user"]; udObject = nil; [self.navigationController popViewControllerAnimated:YES]; } @end
// // WPViewController.h // OC-NSUserDefaults // // Created by wangtouwang on 15/4/8. // Copyright (c) 2015年 wangtouwang. All rights reserved. // #import <UIKit/UIKit.h> @interface WPViewController : UIViewController @end // // WPViewController.m // OC-NSUserDefaults // // Created by wangtouwang on 15/4/8. // Copyright (c) 2015年 wangtouwang. All rights reserved. // #import "WPViewController.h" #import "TurnViewController.h" #import "WPUser.h" @interface WPViewController () //保存字符串数据 @property(nonatomic,strong) UILabel *stringLable; @property(nonatomic,strong) UITextField *stringTextFile; //保存NSNumber类型 @property(nonatomic,strong) UILabel *numberLable; @property(nonatomic,strong) UITextField *numberField; //保存日期类型 @property(nonatomic,strong) UILabel *dateLable; @property(nonatomic,strong) UITextField *dateField; //保存数组类型 @property(nonatomic,strong) UILabel *arrayLable; @property(nonatomic,strong) UITextField *array_ALable; @property(nonatomic,strong) UITextField *array_BLable; //保存集合类型 @property(nonatomic,strong) UILabel *dicLable; @property(nonatomic,strong) UITextField *dic_ALable; @property(nonatomic,strong) UITextField *dic_BLable; //保存BOOL类型 @property(nonatomic,strong) UILabel *boolLable; @property(nonatomic,strong) UITextField *boolField; //保存对象类型 //显示按钮 @property(nonatomic,strong) UIButton *viewButton; //转向填写数据页面 @property(nonatomic,strong) UIButton *turnButton; //转向保存数据页面 -(void)turnPage; //显示保存数据 -(void)viewData; @end @implementation WPViewController - (void)viewDidLoad { [super viewDidLoad]; [self.view setBackgroundColor:[UIColor grayColor]]; self.stringLable = [[UILabel alloc] initWithFrame:CGRectMake(10, 100, 180, 25)]; self.stringLable.text=@"保持字符串数据"; self.stringLable.font = [UIFont fontWithName:@"Helvetica" size:12]; self.stringTextFile=[[UITextField alloc] initWithFrame:CGRectMake(115, 100, 180, 25)]; self.stringTextFile.borderStyle=UITextBorderStyleRoundedRect; self.stringTextFile.font= [UIFont fontWithName:@"Helvetica" size:12]; [self.view addSubview:self.stringLable]; [self.view addSubview:self.stringTextFile]; self.numberLable = [[UILabel alloc] initWithFrame:CGRectMake(10, 130, 180, 25)]; self.numberLable.text=@"保持数值类型"; self.numberLable.font = [UIFont fontWithName:@"Helvetica" size:12]; self.numberField=[[UITextField alloc] initWithFrame:CGRectMake(115, 130, 180, 25)]; self.numberField.borderStyle=UITextBorderStyleRoundedRect; self.numberField.font= [UIFont fontWithName:@"Helvetica" size:12]; [self.view addSubview:self.numberLable]; [self.view addSubview:self.numberField]; self.dateLable = [[UILabel alloc] initWithFrame:CGRectMake(10, 160, 180, 25)]; self.dateLable.text=@"保持日期类型"; self.dateLable.font = [UIFont fontWithName:@"Helvetica" size:12]; self.dateField=[[UITextField alloc] initWithFrame:CGRectMake(115, 160, 180, 25)]; self.dateField.borderStyle=UITextBorderStyleRoundedRect; self.dateField.font= [UIFont fontWithName:@"Helvetica" size:12]; [self.view addSubview:self.dateLable]; [self.view addSubview:self.dateField]; self.arrayLable = [[UILabel alloc] initWithFrame:CGRectMake(10, 190, 180, 25)]; self.arrayLable.text=@"保持数组类型"; self.arrayLable.font = [UIFont fontWithName:@"Helvetica" size:12]; self.array_ALable=[[UITextField alloc] initWithFrame:CGRectMake(115, 190, 180, 25)]; self.array_ALable.borderStyle=UITextBorderStyleRoundedRect; self.array_ALable.font= [UIFont fontWithName:@"Helvetica" size:12]; self.array_BLable=[[UITextField alloc] initWithFrame:CGRectMake(115, 220, 180, 25)]; self.array_BLable.borderStyle=UITextBorderStyleRoundedRect; self.array_BLable.font= [UIFont fontWithName:@"Helvetica" size:12]; [self.view addSubview:self.arrayLable]; [self.view addSubview:self.array_ALable]; [self.view addSubview:self.array_BLable]; self.dicLable = [[UILabel alloc] initWithFrame:CGRectMake(10, 250, 180, 25)]; self.dicLable.text=@"保持集合类型"; self.dicLable.font = [UIFont fontWithName:@"Helvetica" size:12]; self.dic_ALable=[[UITextField alloc] initWithFrame:CGRectMake(115, 250, 180, 25)]; self.dic_ALable.borderStyle=UITextBorderStyleRoundedRect; self.dic_ALable.font= [UIFont fontWithName:@"Helvetica" size:12]; self.dic_BLable=[[UITextField alloc] initWithFrame:CGRectMake(115, 280, 180, 25)]; self.dic_BLable.borderStyle=UITextBorderStyleRoundedRect; self.dic_BLable.font= [UIFont fontWithName:@"Helvetica" size:12]; [self.view addSubview:self.dicLable]; [self.view addSubview:self.dic_ALable]; [self.view addSubview:self.dic_BLable]; self.boolLable = [[UILabel alloc] initWithFrame:CGRectMake(10, 310, 180, 25)]; self.boolLable.text=@"保持布尔类型"; self.boolLable.font = [UIFont fontWithName:@"Helvetica" size:12]; self.boolField=[[UITextField alloc] initWithFrame:CGRectMake(115, 310, 180, 25)]; self.boolField.borderStyle=UITextBorderStyleRoundedRect; self.boolField.font= [UIFont fontWithName:@"Helvetica" size:12]; [self.view addSubview:self.boolLable]; [self.view addSubview:self.boolField]; self.viewButton = [[UIButton alloc] initWithFrame:CGRectMake(80, 340, 100, 25)]; self.viewButton.backgroundColor=[UIColor redColor]; [self.viewButton setTitle:@"显示" forState:UIControlStateNormal]; [self.viewButton.layer setCornerRadius:10.0]; //设置矩形四个圆角半径 [self.view addSubview:self.viewButton]; [self.viewButton addTarget:self action:@selector(viewData) forControlEvents:UIControlEventTouchUpInside]; self.turnButton = [[UIButton alloc] initWithFrame:CGRectMake(200, 340, 100, 25)]; [self.turnButton setTitle:@"转向" forState:UIControlStateNormal]; self.turnButton.backgroundColor=[UIColor redColor]; [self.turnButton.layer setCornerRadius:10.0]; //设置矩形四个圆角半径 [self.view addSubview:self.turnButton]; [self.turnButton addTarget:self action:@selector(turnPage) forControlEvents:UIControlEventTouchUpInside]; } -(void)turnPage{ NSLog(@"Ready TURN SAVE DATA PAGE"); [self.navigationController pushViewController:[TurnViewController new] animated:YES]; } -(void)viewData{ NSLog(@"READY VIEW SAVE DATA"); //通过NSUserDefaults读取数据 NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; self.stringTextFile.text=[ud objectForKey:@"string"]; self.numberField.text= [NSString stringWithFormat: @"%lu", [ud integerForKey:@"number"]]; NSDateFormatter *format = [[NSDateFormatter alloc] init]; format.dateFormat=@"yy-MM-dd HH:mm"; NSLog(@"%@",[ud objectForKey:@"date"]); self.dateField.text=[format stringFromDate:[ud objectForKey:@"date"]];; NSArray *array = [ud objectForKey:@"array"]; self.array_ALable.text=(NSString *)array[0]; self.array_BLable.text=(NSString *)array[1]; NSDictionary *dic = [ud dictionaryForKey:@"dictionary"]; self.dic_ALable.text=[dic objectForKey:@"dicA"]; self.dic_BLable.text=[dic objectForKey:@"dicB"]; self.boolField.text=[NSString stringWithFormat: @"%i", [ud boolForKey:@"BOOL"]]; NSData *udObject = [ud objectForKey:@"user"]; WPUser *wpuser = [NSKeyedUnarchiver unarchiveObjectWithData:udObject] ; if (wpuser!=nil) { NSLog(@"account = %@",wpuser.account); NSLog(@"paw = %@",wpuser.paw); } } @end