简介
Preference主要用到
NSUserDefaults
,NSUserDefaults
是一个单例,提供了一个默认的系统编程接口进行交互,一般用来存储应用程序相关的偏好设置,配置数据等,以便于下次启动程序之后能恢复上次的设置。
而且它可以在程序的任何地方存储和读取数据。在运行时,可以使用NSUerDefaults
对象读取应用程序的默认数据库来获取数据。
NSUerDefaults
具有缓存机制,所以不必再每次读取数据的时候都打开应用程序的默认设置数据库。可以通过synchronize
方法来使内存中的缓存与系统默认数据库进行同步。
可存储的数据类型
NSUserDefaults
支持的数据类型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL.
数据的存储操作
//1.获得NSUserDefaults文件 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; //2.向文件中写入内容 [userDefaults setObject:@"AAA" forKey:@"a"]; [userDefaults setBool:YES forKey:@"sex"]; [userDefaults setInteger:21 forKey:@"age"]; //2.1立即同步 [userDefaults synchronize]; //3.读取文件 NSString *name = [userDefaults objectForKey:@"a"]; BOOL sex = [userDefaults boolForKey:@"sex"]; NSInteger age = [userDefaults integerForKey:@"age"]; NSLog(@"%@, %d, %ld", name, sex, age);
存储自定义对象类型
NSUserDefaults
本身不支持自定义对象的存储, 但是NSUserDefaults
可以存储NSData
类型,所以在存储自定义类型时,转换成NSData类型来存储。
第一步:自定义对象遵守<NSCoding>
协议,并实现
- (void)encodeWithCoder:(NSCoder *)aCoder;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder;
第二步: 存储、读取
Student *zhang = [[Student alloc]init];
zhang.name = @"ZhangSan";
zhang.age = @"18";
//存储
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:zhang];
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject:data forKey:@"student"];
[user synchronize];
//读取
NSData *data1 = [user objectForKey:@"student"];
Student *student = [NSKeyedUnarchiver unarchiveObjectWithData:data1];
NSLog(@"%@",student.name); //输出zhangsan
注意
- 对相同的
Key
赋值约等于一次覆盖,要保证每一个Key
的唯一性 -
NSUserDefaults
存储的对象全是不可变的. 例如,如果我想要存储一个NSMutableArray
对象,我必须先创建一个不可变数组NSArray
再将它存入NSUserDefaults
中去 - 偏好设置是专门用来保存应用程序的配置信息的,一般不要在偏好设置中保存其他数据。
- 如果没有调用
synchronize
方法,系统会根据I/O情况不定时刻地保存到文件中。所以如果需要立即写入文件的就必须调用synchronize
方法。 - 偏好设置会将所有数据保存到同一个文件中。即
preference
目录下的一个以此应用包名来命名的plist
文件。