NSUserDefault

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ò),侵刪。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容