iOS学习笔记--04 NSUserDefaults

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


当然,如果是存储多个user对象,则先将User转为NSData对象,将其存入数组,再存入NSUserDefaults。


参考:http://my.oschina.net/u/1245365/blog/294449


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值