码迷,mamicode.com
首页 > 其他好文 > 详细

NSUserDefaults的一些用法

时间:2015-06-09 19:23:12      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:

NSUserDefaults是一个单例,整个程序中只有一个实例化对象。
NSUserDefaults支持的数据类型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL。
不支持自定义的Model类型。
如保存一个NSString的数据,可以用

NSString *passWord = @"123456";
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject:passWord forKey:@"userPassWord"];

读取数据时,用

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
NSString *passWord = [user objectForKey:@"userPassWord"];

需要注意的是,对于相同key的多次赋值,相当于多次覆盖,所以要保证key的唯一性。

NSUserDefaults存储的对象全是不可变的。如想存储NSMutableArray的数据时,必须先创建一个不可变数组NSArray,再将它存入NSUserDefaults。如:

NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"123",@"234", nil];
NSArray * array = [NSArray arrayWithArray:mutableArray];
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject:array forKey:@"存储的一定是不可变的"]; 

读取数据时,可以用NSUserDefaults对可变数组赋值。但要注意

/*-------------------------错误的赋值方法-------------------*/
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
//这样写后,mutableArray 就变成了不可变数组了,如果你要在数组中添加或删除数据就会出现bug
NSMutableArray *mutableArray = [user objectForKey:@"存储的一定是不可变的"];

正确的做法为:

/*-------------------------正确的赋值方法-------------------*/
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
//可以用alloc 方法代替
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:[user objectForKey:@"存储的一定是不可变的"]];

 

在存储自定义Model时,往往一个对象有多个属性,如User有name,age,sex等属性。但NSUserDefaults不支持自定义Model,需要先将其转化为NSData。如:
先建个User类,

@interface User:NSObject
@property(nonatomic,copy) NSString *name;
@property(nonatomic,copy) NSString *age;
@end

若要将User转化为NSData,就需要遵守NSCoding协议 ,在.m中实现encodeWithCoder和
initWithCoder方法。
所以修改如下:

@interface User:NSObject<NSCoding>
@property(nonatomic,copy) NSString *name;
@property(nonatomic,copy) NSString *age;
@end

在.m中

@implementation User
-(void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeObject:self.age forKey:@"age"];
}

-(id)initWithCoder:(NSCoder *) aDecoder{
    if(self = [super init]){
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.age = [aDecoder decodeObjectForKey:@"age"];
    }
    return self;
}

@end

 

然后将自定义类型存入NSUserDefaults中,可以建一个NSMutableArray存储所有的User。

User *user = [[User alloc] ini];
//下面进行的是对user对象的 name ,age的赋值
user.name = @"somebody";
user.age = @"12";
//这是一个存放所有用户的数组
NSMutableArray * dataArray = [NSMutableArray arrayWithCapacity:50];
//将user类型变为NSData类型
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:user];
//存放数据的数组将data加入进去    
[dataArray addObject:data];

若只想存储一个人的信息,可以直接将NSData存入NSUserDefaults中

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:user];   
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
[userDefault setObject:data forKey:@"oneUser"];

从NSData中还原数据也很简单,如

NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
NSdData *data = [user objectForKey:@"oneUser"];
User *user = [NSKeyedUnarchiver unarchiveObjectWithData:data];

 

NSUserDefaults的一些用法

标签:

原文地址:http://www.cnblogs.com/Apologize/p/4564153.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!