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