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];