NSUserDefault

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末萍肆,一起剝皮案震驚了整個(gè)濱河市袍榆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌塘揣,老刑警劉巖包雀,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異亲铡,居然都是意外死亡才写,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)奖蔓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)琅摩,“玉大人,你說(shuō)我怎么就攤上這事锭硼。” “怎么了蜕劝?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵檀头,是天一觀的道長(zhǎng)轰异。 經(jīng)常有香客問(wèn)我,道長(zhǎng)暑始,這世上最難降的妖魔是什么搭独? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮廊镜,結(jié)果婚禮上牙肝,老公的妹妹穿的比我還像新娘。我一直安慰自己嗤朴,他們只是感情好配椭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著雹姊,像睡著了一般股缸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吱雏,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天敦姻,我揣著相機(jī)與錄音,去河邊找鬼歧杏。 笑死镰惦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的犬绒。 我是一名探鬼主播旺入,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼懂更!你這毒婦竟也來(lái)了眨业?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤沮协,失蹤者是張志新(化名)和其女友劉穎龄捡,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體慷暂,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡聘殖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了行瑞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奸腺。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖血久,靈堂內(nèi)的尸體忽然破棺而出突照,到底是詐尸還是另有隱情,我是刑警寧澤氧吐,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布讹蘑,位于F島的核電站末盔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏座慰。R本人自食惡果不足惜陨舱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望版仔。 院中可真熱鬧游盲,春花似錦、人聲如沸蛮粮。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蝉揍。三九已至链峭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間又沾,已是汗流浹背弊仪。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留杖刷,地道東北人励饵。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像滑燃,于是被迫代替她去往敵國(guó)和親役听。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Apple官方說(shuō)明 NSUserDefault 是什么表窘? 個(gè)人理解使用戶(hù)保存一些用戶(hù)習(xí)慣典予,用于輕量級(jí)數(shù)據(jù)的持久話(huà),...
    我叫白開(kāi)水閱讀 1,241評(píng)論 0 0
  • 一乐严、了解NSUserDefaults以及它可以直接存儲(chǔ)的類(lèi)型 NSUserDefaults是一個(gè)單例瘤袖,在整個(gè)程序中...
    哇拉黑閱讀 2,382評(píng)論 0 2
  • iOS 開(kāi)発の結(jié)構(gòu) 畫(huà)面 UI UIWebview [[UIApplication sharedApplicati...
    RencaiXiong閱讀 586評(píng)論 0 0
  • 1.存對(duì)象 例如數(shù)組對(duì)象,如果直接存昂验,會(huì)造成崩潰捂敌,原因是因?yàn)闆](méi)有這個(gè)數(shù)據(jù)類(lèi)型在NSuserdefault里面,必須...
    赤焰軍少帥林殊閱讀 487評(píng)論 0 0
  • NSUserDefaults適合存儲(chǔ)輕量級(jí)的本地?cái)?shù)據(jù)既琴,主要用于保存用戶(hù)名占婉、密碼等常用資料。 主要保存數(shù)據(jù)類(lèi)型:NS...
    上善若水jf閱讀 440評(píng)論 0 1