深入學習NSUserDefaults/standardUserDefaults

NSUserDefaults

NSUserDefaults 是iOS Foundation 框架提供的一種用於存儲管理單例。

Tip 1:支持存儲的類型

  • NSArray
  • NSData
  • NSDictionary
  • NSNumber
  • NSString

通過NSData可以存儲大部分類型的文件,例如要存儲一張圖片可以先把圖片轉爲NSData。

// 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從上到下透過域的層級尋找正確的值,不同的域有不同的功能,有些域是可持久的,有些域則不行。

  • 應用域(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從上到下透過域的層級尋找正確的值,不同的域有不同的功能,有些域是可持久的,有些域則不行。

發佈了55 篇原創文章 · 獲贊 86 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章