NSUserDefaults類提供了一個與默認系統(tǒng)進行交互的編程接口。
NSUserDefaults對象是用來保存,恢復應用程序相關的偏好設置,配置數據等等。默認系統(tǒng)允許應用程序自定義它的行為去迎合用戶的喜好。你可以在程序運行的時候從用戶默認的數據庫中讀取程序的設置。
2 >NSUserDefaults使用細節(jié)
1.從NSUserDefaults返回的值是不可改變的,即便是你在存儲的時候使用的是可變的值。例如你使用mutableString做為“MyStringDefault”的值,當你再使用stringForKey:方法獲取的值,這個值仍然是不可變的。
2.NSUserDefaults是單例,通過類方法standardUserDefaults可以獲取NSUserDefaults單例,同時也是線程安全的。
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];```
3.NSUserDefaults單例以`key-value`的形式存儲了一系列偏好設置,key是名稱,value是相應的數據。存/取數據時可以使用方法objectForKey:和setObject:forKey:來把對象存儲到相應的plist文件中,或者讀取,既然是plist文件,那么對象的類型則必須是plist文件可以存儲的類型,如下:
NSData
NSString
NSNUmber
NSDate
NSArray
NSDictionary這些實例
如果你想存儲其他類型的對象,你要將其歸檔并創(chuàng)建一個NSData來實現(xiàn)存儲。
需要注意的是,即使對象是NSArray或NSDictionary,他們存儲的類型也應該是以上范圍包括的。```
3> 實例
#存儲基本數據
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@”jack“ forKey:@"firstName"];
[defaults setInteger:10 forKey:@"Age"];
#存儲一個圖片
UIImage *image =[UIImage imageNamed:@"somename"];
NSData *imageData = UIImageJPEGRepresentation(image, 100); #把image歸檔為NSData
[defaults setObject:imageData forKey:@"image"];
[defaults synchronize];
//synchronize, 是為了避免了在每次讀取數據時候都打開用戶默認數據庫的操作??梢酝ㄟ^調用`synchronize`方法來使內存中的緩存與用戶默認系統(tǒng)進行同步。
#讀取基本數據
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *firstName = [defaults objectForKey:@"firstName"];
NSInteger age = [defaults integerForKey:@"Age"];
#讀取圖片數據
NSData *imageData = [defaults dataForKey:@"image"]; #先保存到NSData
UIImage *image = [UIImage imageWithData:imageData];
4>直接指明類型存儲
- setBool:forKey:
- setFloat:forKey:
- setInteger:forKey:
- setDouble:forKey:
- setURL:forKey:
//方法-setInteger:,這跟常用的-setObject:相比設置類型更明確。
5> NSUserDefaults的 域
NSUserDefaults數據庫中其實是由多個層級的域組成的,當你讀取一個鍵值的數據時,NSUserDefaults從上到下透過域的層級尋找正確的值,不同的域有不同的功能,有些域是可持久的,有些域則不行。
* 應用域(application domain)是最重要的域,它存儲著你app通過NSUserDefaults set...forKey添加的設置。
* 注冊域(registration domain)僅有較低的優(yōu)先權,只有在應用域沒有找到值時才從注冊域去尋找。
* 全局域(global domain)則存儲著系統(tǒng)的設置
* 語言域(language-specific domains)則包括地區(qū)、日期等
* 參數域( argument domain)有最高優(yōu)先權