NSUserDefaults 使用
NSUserDefaults是什么,有什么用處
對于應(yīng)用來說,每個(gè)用戶都有自己的獨(dú)特偏好設(shè)置,而好的應(yīng)用會(huì)讓用戶根據(jù)喜好選擇合適的使用方式,把這些偏好記錄在應(yīng)用包的plist文件中,通過NSUserDefaults類來訪問,這是NSUserDefaults的常用姿勢。如果有一些設(shè)置你希望用戶即使升級后還可以繼續(xù)使用,比如玩游戲時(shí)得過的最高分、喜好和通知設(shè)置、主題顏色甚至一個(gè)用戶頭像,那么你可以使用NSUserDefaults來存儲(chǔ)這些信息,如果有更多需求,可以了解數(shù)據(jù)持久化相關(guān)的知識(shí)。
具體來說NSUserDefaults是iOS系統(tǒng)提供的一個(gè)單例類(iOS提供了若干個(gè)單例類),通過類方法standardUserDefaults可以獲取NSUserDefaults單例。如:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSUserDefaults的存儲(chǔ)類型
NSUserDefaults單例以key-value的形式存儲(chǔ)了一系列偏好設(shè)置,key是名稱,value是相應(yīng)的數(shù)據(jù)。存/取數(shù)據(jù)時(shí)可以使用方法objectForKey:和setObject:forKey:來把對象存儲(chǔ)到相應(yīng)的plist文件中,或者讀取,既然是plist文件,那么對象的類型則必須是plist文件可以存儲(chǔ)的類型,正如官方文檔中提到的——
NSData
NSString
NSNumber
NSDate
NSArray
NSDictionary
而如果需要存儲(chǔ)plist文件不支持的類型,比如圖片,可以先將其歸檔為NSData類型,再存入plist文件,需要注意的是,即使對象是NSArray或NSDictionary,他們存儲(chǔ)的類型也應(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);
存/讀不同類型數(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];
注意:對相同的Key賦值約等于一次覆蓋,要保證每一個(gè)Key的唯一性。
NSUserDefaults 存儲(chǔ)的對象全是不可變的(這一點(diǎn)非常關(guān)鍵,弄錯(cuò)的話程序會(huì)出bug),例如,如果我想要存儲(chǔ)一個(gè)?NSMutableArray 對象,我必須先創(chuàng)建一個(gè)不可變數(shù)組(NSArray)再將它存入NSUserDefaults中去
使用 NSUserDefaults 存儲(chǔ)自定義對象
當(dāng)數(shù)據(jù)重復(fù)而且多的時(shí)候(例如想存儲(chǔ)全班同學(xué)的學(xué)號(hào),姓名,性別(這個(gè)數(shù)據(jù)量可能太大了 )),如果不用SQLite存儲(chǔ) (多數(shù)據(jù)最好還是用這個(gè)),你可以選擇使用歸檔,再將文件寫入本地,但是這種方式和NSUserDefaults比起來麻煩多了(因?yàn)镹SFileManage 本來就挺復(fù)雜) ,但是問題是,NSUserDefaults本身不支持自定義對象的存儲(chǔ),不過它支持NSData的類型,下面舉一個(gè)例子來介紹。
NSUserDefaults只支持基本數(shù)據(jù)類型,如果需要保存自定義的對象,就需要借助NSKeyedArchiver將對象歸檔成NSData,然后再用[useDefault setObject: forKey:];方法保存。自定義對象要遵循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、將自定義類型轉(zhuǎn)換為NSData類型
Demo *demo =[[Demo alloc]init];
demo.str=@"test";
demo.interget=10;
demo.flo=12.0f;
NSData*demoData =[NSKeyedArchiver archivedDataWithRootObject:demo];
2、將自定義類型數(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ò),侵刪。