·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> IOS学习笔记2015-04-08OC-NSUserDefaults持久化对象

IOS学习笔记2015-04-08OC-NSUserDefaults持久化对象

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名、密码之类的;

NSUserDefaults被设计用来存储设备和应用的配置信息,它通过一个工厂方法返回默认的、也是最常用到的实例对象。这个对象中储存了系统中用户的配置信息,开发者可以通过这个实例对象对这些已有的信息进行修改,也可以按照自己的需求创建新的配置项。

 

NSUserDefaults把配置信息以字典的形式组织起来,支持字典的项包括:字符串或者是数组,除此之外还支持数字等基本格式。一句话概括就 是:基础类型的小数据的字典。操作方法几乎与NSDictionary的操作方法无异,另外还可以通过指定返回类型的方法获取到指定类型的返回值。

 

\

 

在这需要着重介绍下 保存 自定义对象类型

 假如简单的将自定义对象放入NSUserdefaults 中去存储是不会成功,我们需要转换下思路,我们需要将对象转换成NSData,再去存储

简单的说就是自定义对象需要实现NSConding 协议,并且实现两个方法,分别是 encodeWithCoder和 initWithCoder

 下面看代码吧

1 文件结构 

    2 代码如下
//
//  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