目录
1. 简介
NSUserDefaults是一个单例,在整个程序中只有一个实例对象,他可以用于数据的永久保存,而且简单实用,这是它可以让数据自由传递的一个前提
可以保存的数据结构。在NSUserDefaults中,可以保存的数据结构有:
- NSString 字符串
- NSNumber 数字
- NSArray 数组
- NSDictionary 字典
- NSDate 日期
- NSData 二进制数据
- 如果需要保存自定义对象,则需要将对象归档为NSData,再进行保存。详情见section 4.2
2. 基本使用
2.1 步骤
- 获取NSUserDefaults实例
- 获取数据/删除数据/存储数据
- 通知写入
2.2 对应接口
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; //获取NSUserDefaults实例。
[defaults setObject:object forKey:key]; //存储数据。
id object = [defaults objectForKey:key]; //获取数据。用key获取保存的对象,返回值为id类型,所以可以接任何指针
[defaults removeObjectForKey:key]; //删除数据。使用key删除保存的值
NSString *appdomainStr = [[NSBundle mainBundle] bundleIdentifier];
[defaults removePersistentDomainForName:appdomainStr]; //一次性删除全部存储
[defaults synchronize]; //通知立刻写入。保存完数据后,如果马上抛出异常,可能会丢失数据,所以建议保存完后,调用synchronize方法,通知马上写入
2.2 示例代码
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"Wally" forKey:@"NAME"];
[defaults setObject:number forKey:@"NUMBER"];
id name = [defaults objectForKey:@"NAME"];
id num = [defaults objectForKey:@"NUMBER"];
[defaults removeObjectForKey:@"ARRAY"];
[defaults synchronize];
3. 常用接口及属性
NSUserDefaults可以存储上面说到的6种类型,苹果爸爸还给我们提供了直接转换出对应类型的方法,避免每次都写强转代码。
3.1 存储
//存储Int值
[defaults setInteger:123 forKey:@"INT"];
//存储布尔值
[defaults setBool:YES forKey:@"BOOL"];
//存储浮点型
[defaults setFloat:3.14 forKey:@"FLOAT"];
//存储数组
NSArray* arr = [NSArray arrayWithObjects:@"Wally", @"Barry", @"Rose", nil];
[defaults setObject:arr forKey:@"ARRAY"];
3.2 获取
//获取Int值
[defaults integerForKey:@"INT"];
//获取BOOL布尔值
[defaults boolForKey:@"BOOL"];
//获取浮点值
[defaults floatForKey:@"FLOAT"];
//获取数组
[defaults objectForKey:@"ARRAY"];
4. 注意点
4.1 NSUserDefaults 存储的对象全是不可变的
NSUserDefaults 存储的对象全是不可变的(这一点非常关键,弄错的话程序会出bug)
NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"123",@"234", nil];
NSArray * array = [NSArray arrayWithArray:mutableArray];
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject:array forKey:@"记住存放的一定是不可变的"];
4.2 将自定义类型数据读写 NSUserDefaults
使用NSKeyedArchiver 对数据进行归档 反归档(iOS的归档,应该就类似于数据的序列化和反序列化机制)
- 定义一个遵守NSCoding协议的类
- 复写NSCoding协议中的initWithCoder方法和encodeWithCoder方法,initWithCoder方法是为了解档,用数据恢复对象,encodeWithCoder方法是为了将对象归档
- 归档(序列化):使用NSKeyedUnarchiver,调用archivedDataWithRootObject方法,归档对象,即将自定义类型对象转换成NSDate类型
- 解档(反序列化):使用NSKeyedUnarchiver,调用unarchiveObjectWithData方法,解档对象,即将data类型转换对象成自定义类型
写入数据
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:student]; //归档
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject:data forKey:@"oneStudent"];
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
读取数据
// 读取data数据
NSData *data = [user objectForKey:@"oneStudent"];
// 将data类型转换成student类型
Student *student = [NSKeyedUnarchiver unarchiveObjectWithData:data]; //解档
4.3 非即时写入
UserDefaults是根据时间戳定时的把缓存中的数据写入本地磁盘,而非即时写入。为了防止数据丢失,我们在对重要的数据保存时使用synchornize方法强制写入。但是也要注意,不用频繁的使用synchornize,这样毕竟影响性能和效率,