iOS学习笔记--04 NSUserDefaults

来源:互联网 发布:java中tcp和udp的区别 编辑:程序博客网 时间:2024/06/06 09:02

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
原创粉丝点击