关于NSUserDefaults

本文详细介绍了如何使用NSUserDefaults进行数据持久化存储,包括支持的数据类型、自定义对象的存储方式及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    NSUserDefaults是一个单例,在整个程序中只有一个实例对象,可以用于数据的永久保存。

   他的作用一般是用来保存和恢复应用程序相关的偏好设置,配置数据等等。默认系统允许应用程序自定义它的行为去迎合用户的喜好。你可以在程序运行的时候从用户默认的数据库中读取程序的设置。同时NSUserDefaults的缓存避免了在每次读取数据时候都打开用户默认数据库的操作。可以通过调用synchronize方法来使内存中的缓存与用户默认系统进行同步。

    NSUserDefaults支持的数据类型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL.

        如果想要将上述数据类型的数据永久保存到NSUserDefaults中去,只需要简单的操作(一个Value 一个Key ),例如,eg想要保存一个NSString的对象:

   

<span style="font-size:18px;">//将NSString 对象存储到 NSUserDefaults 中
    NSString *passWord = @"1234567";
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    [user setObject:passWord forKey:@"userPassWord"];</span>

<span style="font-size:18px;">//取数据
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    NSString *passWord = [ user objectForKey:@"userPassWord"];</span>



如果你想存储其他类 型的对象,你要将其归档并创建一个NSData来实现存储。

   当数据重复而且多的时候(例如想存储所有对象的属性(这个数据量可能太大了 )),如果不用SQLite 存储 (多数据最好还是用这个),你可以选择使用归档,再将文件写入本地,但是这种方式和 NSUserDefaults 比起来麻烦多了(因为NSFileManage 本来就挺复杂),但是问题是,NSUserDefaults 本身不支持自定义对象的存储,不过它支持NSData的类型

   建立一个随意类,比如person类,给予他几个属性,代码如下:

   
person.name = @"AlenChen";
person.age = 15;
person.weight = 75.5f;

我们要做的就是将person类型变成NSData类型 ,那么就必须实现归档:

需要 在person.h 文件中申明 NSCoding 协议,再 在 .m 中实现 encodeWithCoder 方法 和 

initWithCoder 方法,代码如下:

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

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

这样做就可以将自定义类型转变为NSData类型了


如果你只想存一个人的信息,你可以直接将NSData存入NSUserDefaults中 :

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



如果要多个对象的信息,我们可以建一个NSMutableArray 来存放多人信息(里面存储的全是NSData对象)在需要存储的地方加入代码:


     
    
//数组
    NSMutableArray * dataArray = [NSMutableArray arrayWithCapacity:50];
     
    //将person类型变为NSData类型
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:person];
     
    //存放数据的数组将data加入进去
    [dataArray addObject:data];

    NSArray * array = [NSArray arrayWithArray:dataArray];
     
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    [user setObject:array forKey:@"all person"];


取出数据也相对简单
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
  
 NSdData *data = [user objectForKey:@"person"];
     
 person *person = [NSKeyedUnarchiver unarchiveObjectWithData:data];




  

注意的地方有两点:
1.对相同的Key赋值约等于一次覆盖,要保证每一个Key的唯一性 
2. NSUserDefaults 存储的对象全是不可变的这一点非常关键,弄错的话程序会�'BAbug),例如想要存储一个 NSMutableArray 对象,必须先创建一个不可变数组(NSArray)再将它存入NSUserDefaults中去


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值