NSUserDefaults

来源:互联网 发布:网络歌曲人生路视频 编辑:程序博客网 时间:2024/05/17 07:37

(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 







0 0
原创粉丝点击