NSUserDefaults是一个单例,在整个程序中只有一个实例对象,他可以用于数据的永久保存,而且简单实用,这是它可以让数据自由传递的一个前提
可以保存的数据结构。在NSUserDefaults中,可以保存的数据结构有:
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方法,通知马上写入
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];
NSUserDefaults可以存储上面说到的6种类型,苹果爸爸还给我们提供了直接转换出对应类型的方法,避免每次都写强转代码。
//存储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"];
//获取Int值
[defaults integerForKey:@"INT"];
//获取BOOL布尔值
[defaults boolForKey:@"BOOL"];
//获取浮点值
[defaults floatForKey:@"FLOAT"];
//获取数组
[defaults objectForKey:@"ARRAY"];
NSUserDefaults 存储的对象全是不可变的(这一点非常关键,弄错的话程序会出bug)
NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"123",@"234", nil];
NSArray * array = [NSArray arrayWithArray:mutableArray];
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject:array forKey:@"记住存放的一定是不可变的"];
使用NSKeyedArchiver 对数据进行归档 反归档(iOS的归档,应该就类似于数据的序列化和反序列化机制)
写入数据
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]; //解档
UserDefaults是根据时间戳定时的把缓存中的数据写入本地磁盘,而非即时写入。为了防止数据丢失,我们在对重要的数据保存时使用synchornize方法强制写入。但是也要注意,不用频繁的使用synchornize,这样毕竟影响性能和效率,