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

相關文章
相關標籤/搜索