NSUserDefaults 使用
NSUserDefaults是什么悦荒,有什么用處
對(duì)于應(yīng)用來(lái)說(shuō)户辞,每個(gè)用戶(hù)都有自己的獨(dú)特偏好設(shè)置,而好的應(yīng)用會(huì)讓用戶(hù)根據(jù)喜好選擇合適的使用方式,把這些偏好記錄在應(yīng)用包的plist文件中构哺,通過(guò)NSUserDefaults類(lèi)來(lái)訪(fǎng)問(wèn),這是NSUserDefaults的常用姿勢(shì)战坤。如果有一些設(shè)置你希望用戶(hù)即使升級(jí)后還可以繼續(xù)使用曙强,比如玩游戲時(shí)得過(guò)的最高分、喜好和通知設(shè)置途茫、主題顏色甚至一個(gè)用戶(hù)頭像碟嘴,那么你可以使用NSUserDefaults來(lái)存儲(chǔ)這些信息,如果有更多需求囊卜,可以了解數(shù)據(jù)持久化相關(guān)的知識(shí)娜扇。
具體來(lái)說(shuō)NSUserDefaults是iOS系統(tǒng)提供的一個(gè)單例類(lèi)(iOS提供了若干個(gè)單例類(lèi)),通過(guò)類(lèi)方法standardUserDefaults可以獲取NSUserDefaults單例边败。如:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSUserDefaults的存儲(chǔ)類(lèi)型
NSUserDefaults單例以key-value的形式存儲(chǔ)了一系列偏好設(shè)置袱衷,key是名稱(chēng)卖氨,value是相應(yīng)的數(shù)據(jù)锭沟。存/取數(shù)據(jù)時(shí)可以使用方法objectForKey:和setObject:forKey:來(lái)把對(duì)象存儲(chǔ)到相應(yīng)的plist文件中,或者讀取赂韵,既然是plist文件排截,那么對(duì)象的類(lèi)型則必須是plist文件可以存儲(chǔ)的類(lèi)型嫌蚤,正如官方文檔中提到的——
NSData
NSString
NSNumber
NSDate
NSArray
NSDictionary
而如果需要存儲(chǔ)plist文件不支持的類(lèi)型,比如圖片断傲,可以先將其歸檔為NSData類(lèi)型脱吱,再存入plist文件,需要注意的是认罩,即使對(duì)象是NSArray或NSDictionary箱蝠,他們存儲(chǔ)的類(lèi)型也應(yīng)該是以上范圍包括的。
NSUserDefaults的方法
//設(shè)置- (void)setInteger:(NSInteger)value forKey:(NSString *)defaultName;
- (void)setFloat:(float)value forKey:(NSString *)defaultName;
- (void)setDouble:(double)value forKey:(NSString *)defaultName;
- (void)setBool:(BOOL)value forKey:(NSString *)defaultName;
- (void)setURL:(nullable NSURL *)url forKey:(NSString *)defaultName NS_AVAILABLE(10_6, 4_0);
- (void)setObject:(nullable id)value forKey:(NSString *)defaultName;
- (nullable NSString *)stringForKey:(NSString *)defaultName;
//獲取- (nullable NSArray *)arrayForKey:(NSString *)defaultName;
- (nullable NSDictionary*)dictionaryForKey:(NSString *)defaultName;-
?(nullable NSData *)dataForKey:(NSString *)defaultName;
- (nullable NSArray*)stringArrayForKey:(NSString *)defaultName;
- (NSInteger)integerForKey:(NSString *)defaultName;
- (float)floatForKey:(NSString *)defaultName;
- (double)doubleForKey:(NSString *)defaultName;
- (BOOL)boolForKey:(NSString *)defaultName;
- (nullable NSURL *)URLForKey:(NSString *)defaultName NS_AVAILABLE(10_6, 4_0);
存/讀不同類(lèi)型數(shù)據(jù)
###存
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];
其中垦垂,方法synchronise是為了強(qiáng)制存儲(chǔ)宦搬,其實(shí)并非必要,因?yàn)檫@個(gè)方法會(huì)在系統(tǒng)中默認(rèn)調(diào)用劫拗,但是你確認(rèn)需要馬上就存儲(chǔ)间校,這樣做是可行的。
###存
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *firstName = [defaults objectForKey:@"firstName"]
NSInteger age = [defaults integerForKey:@"Age"];
NSData *imageData = [defaults dataForKey:@"image"];
UIImage *image = [UIImage imageWithData:imageData];
注意:對(duì)相同的Key賦值約等于一次覆蓋页慷,要保證每一個(gè)Key的唯一性憔足。
NSUserDefaults 存儲(chǔ)的對(duì)象全是不可變的(這一點(diǎn)非常關(guān)鍵胁附,弄錯(cuò)的話(huà)程序會(huì)出bug),例如滓彰,如果我想要存儲(chǔ)一個(gè)?NSMutableArray 對(duì)象控妻,我必須先創(chuàng)建一個(gè)不可變數(shù)組(NSArray)再將它存入NSUserDefaults中去
使用 NSUserDefaults 存儲(chǔ)自定義對(duì)象
當(dāng)數(shù)據(jù)重復(fù)而且多的時(shí)候(例如想存儲(chǔ)全班同學(xué)的學(xué)號(hào),姓名找蜜,性別(這個(gè)數(shù)據(jù)量可能太大了 ))饼暑,如果不用SQLite存儲(chǔ) (多數(shù)據(jù)最好還是用這個(gè)),你可以選擇使用歸檔洗做,再將文件寫(xiě)入本地弓叛,但是這種方式和NSUserDefaults比起來(lái)麻煩多了(因?yàn)镹SFileManage 本來(lái)就挺復(fù)雜) ,但是問(wèn)題是诚纸,NSUserDefaults本身不支持自定義對(duì)象的存儲(chǔ)撰筷,不過(guò)它支持NSData的類(lèi)型,下面舉一個(gè)例子來(lái)介紹畦徘。
NSUserDefaults只支持基本數(shù)據(jù)類(lèi)型毕籽,如果需要保存自定義的對(duì)象,就需要借助NSKeyedArchiver將對(duì)象歸檔成NSData,然后再用[useDefault setObject: forKey:];方法保存井辆。自定義對(duì)象要遵循NSCoding協(xié)議关筒。
同時(shí)需要實(shí)現(xiàn)下面的方法
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{if(self =[super init]) {
self.str= [aDecoder decodeObjectForKey:@"str"];
self.interget= [aDecoder decodeIntegerForKey:@"interget"];
self.flo= [aDecoder decodeDoubleForKey:@"flo"];
}returnself;
}
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.str forKey:@"str"];
[aCoder encodeInteger:self.interget forKey:@"interget"];
[aCoder encodeDouble:self.flo forKey:@"flo"];
}
1、將自定義類(lèi)型轉(zhuǎn)換為NSData類(lèi)型
Demo *demo =[[Demo alloc]init];
demo.str=@"test";
demo.interget=10;
demo.flo=12.0f;
NSData*demoData =[NSKeyedArchiver archivedDataWithRootObject:demo];
2杯缺、將自定義類(lèi)型數(shù)據(jù)存入NSUserDefaults 中
[useDefault setObject:demoData forKey:@"demo"];
[useDefault synchronize];
NSData*getData = [useDefault objectForKey:@"demo"];
Demo*getDemo =[NSKeyedUnarchiver unarchiveObjectWithData:getData];
NSLog(@"%@",getDemo);
NSUserDefaults數(shù)據(jù)清除
1.清除每個(gè)Key
/*清除所有的存儲(chǔ)本地的數(shù)據(jù)*/
-?(void)clearAllUserDefaultsData{
NSUserDefaults*userDefaults?=?[NSUserDefaults ?standardUserDefaults];
NSDictionary*dic?=?[userDefaults ?dictionaryRepresentation];
for(idkey?in?dic)?{
[userDefaults ?removeObjectForKey:key];
}
[userDefaults ?synchronize];
}
2.清除某個(gè)Key
[userDefaults ? ?removeObjectForKey:@""];
[userDefaults ? synchronize];
3.清除持久域
/* 清除所有的存儲(chǔ)本地的數(shù)據(jù)*/
-?(void)clearAllUserDefaultsData{
NSString*appDomain?=?[[NSBundlemainBundle]bundleIdentifier];
[[NSUserDefaultsstandardUserDefaults]removePersistentDomainForName:appDomain];
}
整理自網(wǎng)絡(luò)蒸播,侵刪。