NSUserDefaults的一些用法

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)