1眶痰、NSUserDefault——官方文檔
NSUserDefaults類提供了訪問常見類型(如float橘券,double累榜,int,bool和URL)的便捷方法富弦。一個默認(rèn)對象必須是一個屬性列表 - 也就是沟娱,一個實例(或集合,實例的組合):NSData腕柜,NSString济似,NSNumber矫废,NSDate,NSArray或NSDictionary砰蠢。如果要存儲任何其他類型的對象蓖扑,則通常應(yīng)將其存檔以創(chuàng)建NSData的實例。有關(guān)更多詳情台舱,請參閱首選項和設(shè)置編程指南律杠。
注意:當(dāng)我們需要保存一個集合類型時,比如NSArray竞惋,數(shù)組里保存的數(shù)據(jù)也必須是以上的類型柜去,不能是其他類型。
2拆宛、簡單使用
//NSUserDefaults是一個單例嗓奢,獲取對象
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
//存儲一個對象類型
[userDefaults setObject:@"Trump" forKey:@"president"];
//取出一個對象類型
NSString *tump = [userDefaults objectForKey:@"president"];
NSLog(@"%@", tump);
//存儲一個bool類型
[userDefaults setBool:YES forKey:@"isPoor"];
//取出一個bool值
BOOL isPoor = [userDefaults boolForKey:@"isPoor"];
NSLog(@"%d", isPoor);
//NSUserDefaults只能處理NSData、NSString浑厚、NSNumber股耽、NSDate、NSArray瞻颂、NSDictionary這幾種類型豺谈,假如我們要存儲一個UIImage,則要先將其轉(zhuǎn)換成NSData
UIImage *image = [UIImage imageNamed:@"meinv"];
//將圖片歸檔為NSData
NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
//存儲imageData
[userDefaults setObject:imageData forKey:@"imgage"];
//取出Data
NSData *getImageData = [userDefaults objectForKey:@"image"];
//Data轉(zhuǎn)成圖片
UIImage *getImage = [UIImage imageWithData:getImageData];
另外還有一些其他常用的API
//從字面意思就能明白
- setFloat:forKey:
- setInteger:forKey:
- setDouble:forKey:
- setURL:forKey:
3贡这、registerDefaults:的使用
- 在我們使用NSUserDefaults時會遇到一些特殊的情況茬末,比如以下代碼:
BOOL isRMB = [userDefaults boolForKey:@"isRMB"];
我們沒有設(shè)置isRMB的值,直接去取盖矫,這樣它的返回結(jié)果是0丽惭,但是我們并不能確定它是真的NO,還是no value辈双。這個問題很尷尬责掏,我們可以用objectForKey: 解決這個問題,但是用registerDefaults:可以更好的解決這個問題湃望。
//此方法參數(shù)是一個字典换衬,功能就是給isRMB這個key注冊一個默認(rèn)的值
//由于此方法不會將值存儲到磁盤上了,所以這個方法要在程序啟動的時候調(diào)用也就是在application didFinishLaunchingWithOptions:方法中調(diào)用
[userDefaults registerDefaults:@{@"isRMB" : @(YES)}];
//這樣再去取isRMB這個key對應(yīng)的值時就不會出現(xiàn)返回值為no value的情況了
BOOL isRMB = [userDefaults boolForKey:@"isRMB"];
4证芭、域的概念
NSUserDefaults有一個域的概念瞳浦,當(dāng)我們調(diào)用 NSUserDefaults.standardUserDefaults() 方法時,就會初始化 NSUserDefaults废士, 并且它默認(rèn)會包含 5 個 Domain叫潦, 分別是:
- NSArgument Domain (參數(shù)域) 最高優(yōu)先級
- Application Domain (應(yīng)用域) 是最重要的域,它存儲著你app通過NSUserDefaults set...forKey添加的設(shè)置官硝。
- NSGlobal Domain (全局域) 存儲系統(tǒng)設(shè)置
- Language-specific Domains (日期矗蕊,語言)
- Registration Domain (注冊域)僅有較低的優(yōu)先權(quán)短蜕,只有在應(yīng)用域沒有找到值時才從注冊域去尋找。
registerDefaults:就是把值注冊到 Registration Domain (注冊域)中傻咖,然后我們每次去獲取值得時候都會在底層的存儲結(jié)構(gòu)中搜索一遍朋魔,順序從優(yōu)先級最高的開始:
NSArgument Domain -> Application Domain -> NSGlobal Domain -> Language-specific Domains -> NSRegistrationDomain
在使用registerDefaults:時,就是把值注冊在了注冊域中没龙,而注冊域中的數(shù)據(jù)不會被寫到磁盤铺厨,所以我們每次在程序啟動時都要調(diào)用一遍缎玫。