NSUserDefault,从名称也可看出,一般用来记录用户的设置的。这里介绍两种常用场景:检测应用(或app的某个版本)第一次运行 和 记录用户设定的属性。
原理
几句话说下我的理解:
- NSUserDefault使用方法standardUserDefaults得到全局的一个单例
- 在这个单例是个dictionary,即通过key-object来存、取信息
- 信息会存在plist文件中,你不删它,它就一直存在
检测app第一次运行
1
2
3
4
5
6
7
8
9
| // 以下这段代码,检查是否app的这个版本是否是第一次运行
NSString *bundleVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey];
NSString *appFirstStartOfVersionKey = [NSString stringWithFormat:@"first_start_%@", bundleVersion];
NSNumber *alreadyStartedOnVersion = [[NSUserDefaults standardUserDefaults] objectForKey:appFirstStartOfVersionKey];
if(!alreadyStartedOnVersion || [alreadyStartedOnVersion boolValue] == NO) {
[self versionFirstStart];// app的bundleVersion这个版本第一次运行,你希望这时做点儿什么
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:YES] forKey:appFirstStartOfVersionKey];
}
}
|
每次启动app时候,调用这段代码。检查一个叫做first_start_加版本号这么个key,对应的NSNumber类型Object,是否存在,或是否是0(NO),如果不存在,或者是0(NO),那么是这个版本的第一次运行,这时做你想在app第一次运行时做的事儿,比如[self versionFirstStart],之后在plist中添加这个key对应的NSNumber类型object,设置成1(YES)。这样,以后app只要未改变版本,启动时就再也不会执行[self versionFirstStart]了。
参见stackoverflow
P.S. 虽然我并未更改这段代码进行更多尝试,但肯定不一定非要NSNumber这个类型,只要plist能存储和读取的类型就可以。
记录用户设定的属性
想设定一个属性,你给这个属性起个独有的key,比如叫做@“your property key”。
设置属性:
1
| [[NSUserDefaults standardUserDefaults] setObject:@"off" forKey:@"your property key"];
|
读取和判断属性:
1
2
3
| if([[[NSUserDefaults standardUserDefaults] objectForKey:@"your property key"] isEqualToString:@"off"])
{
}
|
更多你要了解的NSUserDefault
1. 可存储的类型
NSUserDefault中存储的object的格式只能是以下列表中的类型,这是plist存储方式决定的。
1
2
3
4
5
6
7
| array
dictionary
data
date
number - integer
number - floating point
Boolean
|
了解更多,可查阅Property List Programming Guide
2. 自动存储
使用NSUserDefault,默认是自动存储的,即你修改完之后,ios自动找个时候,同步(synchronize)一下内存和plist。
手动存储可直接调用synchronize方法:
1
| [[NSUserDefaults standardUserDefaults] synchronize];
|
3. 查看目前NSUserDefaults standardUserDefaults中的内容
查看全部dict内容
1
| NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
|
当然,也可以查看全部的key
1
| NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]);
|