NSUserDefaults類提供了一個(gè)與默認(rèn)系統(tǒng)進(jìn)行交互的編程接口。
NSUserDefaults對(duì)象是用來保存湖饱,恢復(fù)應(yīng)用程序相關(guān)的偏好設(shè)置,配置數(shù)據(jù)等等
。默認(rèn)系統(tǒng)允許應(yīng)用程序自定義它的行為去迎合用戶的喜好廊谓。你可以在程序運(yùn)行的時(shí)候從用戶默認(rèn)的數(shù)據(jù)庫中讀取程序的設(shè)置。
2 >NSUserDefaults使用細(xì)節(jié)
1.從NSUserDefaults返回的值是不可改變
的麻削,即便是你在存儲(chǔ)的時(shí)候使用的是可變的值蒸痹。例如你使用mutableString做為“MyStringDefault”的值春弥,當(dāng)你再使用stringForKey:方法獲取的值,這個(gè)值仍然是不可變的叠荠。
2.NSUserDefaults是單例,通過類方法standardUserDefaults
可以獲取NSUserDefaults單例匿沛,同時(shí)也是線程安全的。
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];```
3.NSUserDefaults單例以`key-value`的形式存儲(chǔ)了一系列偏好設(shè)置榛鼎,key是名稱逃呼,value是相應(yīng)的數(shù)據(jù)。存/取數(shù)據(jù)時(shí)可以使用方法objectForKey:和setObject:forKey:來把對(duì)象存儲(chǔ)到相應(yīng)的plist文件中者娱,或者讀取抡笼,既然是plist文件,那么對(duì)象的類型則必須是plist文件可以存儲(chǔ)的類型,如下:
NSData
NSString
NSNUmber
NSDate
NSArray
NSDictionary這些實(shí)例
如果你想存儲(chǔ)其他類型的對(duì)象黄鳍,你要將其歸檔
并創(chuàng)建一個(gè)NSData來實(shí)現(xiàn)存儲(chǔ)推姻。
需要注意的是,即使對(duì)象是NSArray或NSDictionary框沟,他們存儲(chǔ)的類型也應(yīng)該是以上范圍包括的藏古。```
3> 實(shí)例
#存儲(chǔ)基本數(shù)據(jù)
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@”jack“ forKey:@"firstName"];
[defaults setInteger:10 forKey:@"Age"];
#存儲(chǔ)一個(gè)圖片
UIImage *image =[UIImage imageNamed:@"somename"];
NSData *imageData = UIImageJPEGRepresentation(image, 100); #把image歸檔為NSData
[defaults setObject:imageData forKey:@"image"];
[defaults synchronize];
//synchronize, 是為了避免了在每次讀取數(shù)據(jù)時(shí)候都打開用戶默認(rèn)數(shù)據(jù)庫的操作〗滞可以通過調(diào)用`synchronize`方法來使內(nèi)存中的緩存與用戶默認(rèn)系統(tǒng)進(jìn)行同步校翔。
#讀取基本數(shù)據(jù)
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *firstName = [defaults objectForKey:@"firstName"];
NSInteger age = [defaults integerForKey:@"Age"];
#讀取圖片數(shù)據(jù)
NSData *imageData = [defaults dataForKey:@"image"]; #先保存到NSData
UIImage *image = [UIImage imageWithData:imageData];
4>直接指明類型存儲(chǔ)
- setBool:forKey:
- setFloat:forKey:
- setInteger:forKey:
- setDouble:forKey:
- setURL:forKey:
//方法-setInteger:,這跟常用的-setObject:相比設(shè)置類型更明確。
5> NSUserDefaults的 域
NSUserDefaults數(shù)據(jù)庫中其實(shí)是由多個(gè)層級(jí)的域組成的灾前,當(dāng)你讀取一個(gè)鍵值的數(shù)據(jù)時(shí)防症,NSUserDefaults從上到下透過域的層級(jí)尋找正確的值,不同的域有不同的功能哎甲,有些域是可持久的蔫敲,有些域則不行。
* 應(yīng)用域(application domain)是最重要的域炭玫,它存儲(chǔ)著你app通過NSUserDefaults set...forKey添加的設(shè)置奈嘿。
* 注冊(cè)域(registration domain)僅有較低的優(yōu)先權(quán),只有在應(yīng)用域沒有找到值時(shí)才從注冊(cè)域去尋找吞加。
* 全局域(global domain)則存儲(chǔ)著系統(tǒng)的設(shè)置
* 語言域(language-specific domains)則包括地區(qū)裙犹、日期等
* 參數(shù)域( argument domain)有最高優(yōu)先權(quán)