NSUserDefaults

NSUserDefaults

NSUserDefaults 是iOS Foundation 框架提供的一种用于存储管理单例。ios

Tip 1:支持存储的类型

  • NSArray
  • NSData
  • NSDictionary
  • NSNumber
  • NSString

经过NSData能够存储大部分类型的文件,例如要存储一张图片能够先把图片转为NSData。objective-c

// Create instances of NSData
NSData *imageData = UIImageJPEGRepresentation(contactImage, 100);
// Store the data
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:imageData forKey:@"image"];
复制代码

Tip 2: 存储使用方法

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setInteger:9001 forKey:@"HighScore"];
[defaults synchronize];
复制代码

Tip 3: 获取存储的data

// Get the stored data before the view loads
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *imageData = [defaults dataForKey:@"image"];
UIImage *contactImage = [UIImage imageWithData:imageData];
复制代码

Tip 4: 对于常见的值类型,如Bool,Float,Integer 等能够使用系统提供的一些方法来存储不一样类型值。

- setBool:forKey:
- setFloat:forKey:
- setInteger:forKey:
- setDouble:forKey:
- setURL:forKey:
复制代码

对于存储Bool类型值,取值的时候须要注意使用Bool变量来接住,而不是直接判断对[[NSUserDefaults standardUserDefaults] boolForKey:],直接判断表示[NSUserDefaults standardUserDefaults] 是否能取到对应的Key值,YES表示has value,NO表示no value。数据库

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:APP_IS_FIRST_SESSION_ID];
BOOL flag = [[NSUserDefaults standardUserDefaults] boolForKey:APP_IS_FIRST_SESSION_ID];
//这里的Flag为YES
if ([[NSUserDefaults standardUserDefaults] boolForKey:APP_IS_FIRST_SESSION_ID]) {
 //直接对取值判断,将老是True,这个表明[NSUserDefaults standardUserDefaults]能取到值
}
复制代码

Tip 5: NSUserDefaults域

user defaults数据库中实际上是由多个层级的域组成的,当你读取一个键值的数据时,NSUserDefaults从上到下透过域的层级寻找正确的值,不一样的域有不一样的功能,有些域是可持久的,有些域则不行。app

  • 应用域(application domain)是最重要的域,它存储着你app经过NSUserDefaults set...forKey添加的设置。
  • 注册域(registration domain)仅有较低的优先权,只有在应用域没有找到值时才从注册域去寻找。
  • 全局域(global domain)则存储着系统的设置
  • 语言域(language-specific domains)则包括地区、日期等
  • 参数域( argument domain)有最高优先权

注意须要在每次启动app而且没有在user defaules中读取数据的时候调用以上方法,由于registerDefaults:不能把这些默认数据存储到硬盘上,因此application:didFinishLaunchingWithOptions是最合适的地方。框架

NSURL *defaultPrefsFile = [[NSBundle mainBundle]
URLForResource:@"DefaultPreferences" withExtension:@"plist"];
NSDictionary *defaultPrefs = [NSDictionary dictionaryWithContentsOfURL:defaultPrefsFile];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultPrefs];
复制代码

这样作的缘由是:默认状况下,应用域是空的,没见键也没有值。当应用第一次设置某项用户偏好设置的值时,相应的值会经过指定的键加入应用域。当经过NSUserDefaults获取某项用户偏好设置的值时,NSUserDefaults会先在应用域中查找,若是找到了值,NSUserDefaults就会返回这个值。若是没有找到,NSUserDefaults就会在注册域中查找并返回默认值。 user defaults数据库中实际上是由多个层级的域组成的,当你读取一个键值的数据时,NSUserDefaults从上到下透过域的层级寻找正确的值,不一样的域有不一样的功能,有些域是可持久的,有些域则不行。dom

文章参考: oleb.net/blog/2014/0… developer.apple.com/reference/f… www.ios-blog.co.uk/tutorials/o…spa

相关文章
相关标签/搜索