(1).NSUserDefaults 是适合以下轻量级的本地数据存储,一些简单的数据(NSString类型的)例如密码,网址等,NSUserDefaults肯定是首选,但是如果我们自定义了一个对象,对象保存的是一些信息,这时候就不能直接存储到NSUserDefaults了
(2).NSUserDefaults是一个单例,在整个程序中只有一个实例对象,他可以用于数据的永久保存,而且简单实用
(3). NSUserDefaults支持的数据类型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL
#pragma mark - 存取不可变对象
//如果想要将上述数据类型的数据永久保存到NSUserDefaults中去,只需要简单的操作(一个Value 一个Key ),例如,想要保存一个NSString的对象,代码实现为
//将NSString 对象存储到 NSUserDefaults 中
NSString *passWord = @"1234567";
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject:passWord forKey:@"userPassWord"];
[user setInteger:10 forKey:@"count"];
[user synchronize]; //同步存储到磁盘中,不是必须存储
//将数据取出
NSUserDefaults *users = [NSUserDefaults standardUserDefaults];
NSString *passWord1 = [users objectForKey:@"userPassWord"];
NSLog(@"passWord1 == %@",passWord1);
//注意: 对相同的Key赋值约等于一次覆盖,要保证每一个Key的唯一性
#pragma mark - 照片
UIImage *image = [UIImage imageNamed:@"1.png"];
NSData *imageData = UIImageJPEGRepresentation(image,100); //把image归档为nsdata
[users setObject:imageData forKey:@"image"];
/*
- setBool:forKey:
- setFloat:forKey:
- setInteger:forKey:
- setDouble:forKey:
- setURL:forKey:
*/
存取可变对象
#pragma mark -存取可变对象
//NSUserDefaults 存储的对象全是不可变的 ,如果我想要存储一个 NSMutableArray 对象,我必须先创建一个不可变数组(NSArray)再将它存入NSUserDefaults中去,代码如下:
NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"123",@"234", nil];
NSArray *array = [NSArray arrayWithArray:mutableArray];
NSUserDefaults *user1 = [NSUserDefaults standardUserDefaults];
[user1 setObject:array forKey:@"记住存放的一定是不可变的"];
//取出数据:想要用NSUserDefaults中的数据给可变数组赋值
NSUserDefaults *user2 = [NSUserDefaults standardUserDefaults];
NSMutableArray *arr = [NSMutableArray arrayWithArray:[user2 objectForKey:@"记住存放的一定是不可变的"]];
NSLog(@"arr = %@",arr);
使用 NSUserDefaults 存储自定义对象
(1).自定义对象Student,继承NSObject,在.h文件中:
//我们要做的就是将Student类型变成NSData类型 ,那么就必须实现归档
@interface Student : NSObject<NSCoding>
@property(nonatomic,strong)NSString *name;
@property(nonatomic,strong)NSString *studentNumer;
@property(nonatomic,strong)NSString *sex;
(2).在.m中实现
-(void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.studentNumer forKey:@"number"];
[aCoder encodeObject:self.sex forKey:@"sex"];
}
-(instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.studentNumer = [aDecoder decodeObjectForKey:@"number"];
self.sex = [aDecoder decodeObjectForKey:@"sex"];
}
return self;
}
(3).在viewController中
// 当数据重复而且多的时候(例如想存储全班同学的学号,姓名,性别(这个数据量可能太大了 )),如果不用SQLite 存储 (多数据最好还是用这个),你可以选择使用归档,再将文件写入本地,但是这种方式和 NSUserDefaults 比起来麻烦多了(因为NSFileManage 本来就挺复杂) ,但是问题是,NSUserDefaults 本身不支持自定义对象的存储,不过它支持NSData的类型,下面举一个例子来介绍。
Student *student = [[Student alloc]init];
student.name = @"wangyy";
student.studentNumer = @"101113130";
student.sex = @"女";
//新建一个数组存放全部学生
NSMutableArray *arrayStu = [NSMutableArray arrayWithCapacity:50];
//将student类转变为NSData
NSData *dataa = [NSKeyedArchiver archivedDataWithRootObject:student];
//将data存放在数组中
[arrayStu addObject:dataa];
//如果只想存一个人的信息
NSData *data1 = [NSKeyedArchiver archivedDataWithRootObject:student];
NSUserDefaults *user3 = [NSUserDefaults standardUserDefaults];
[user3 setObject:data1 forKey:@"oneStudent"];
//如果你想存储全班同学的信息,你还要用一个for循环将data 放入 dataArray中
//记住要转换成不可变数组类型
NSArray * arrayAllStu = [NSArray arrayWithArray:arrayStu];
NSUserDefaults *user4 = [NSUserDefaults standardUserDefaults];
[user4 setObject:arrayAllStu forKey:@"allStudent"];
//从NSUserDefaults中取出数据在还原也很简单
NSUserDefaults *user5 = [NSUserDefaults standardUserDefaults];
NSData *data5 = [user5 objectForKey:@"oneStudent"];
Student *student1 = [NSKeyedUnarchiver unarchiveObjectWithData:data5];
删除default值
- (void)removeObjectForKey:(NSString *)defaultName
访问管理环境下的keys
<ul class="ul1"><li class="li5">objectIsForcedForKey:</li><li class="li5">objectIsForcedForKey:inDomain:</li></ul>
维护稳定域
– removeVolatileDomainForName:
– setVolatileDomain:forName:
– volatileDomainForName:
– volatileDomainNames
维护套件
– addSuiteNamed:
– removeSuiteNamed:
保护持久域
– synchronize //存至磁盘
– removePersistentDomainForName:
– setPersistentDomain:forName:
– persistentDomainNamesDeprecated