NSUserDefaults 簡(jiǎn)介获高,使用 NSUserDefaults 存儲(chǔ)自定義對(duì)象

NSUserDefaults適合存儲(chǔ)輕量級(jí)的本地?cái)?shù)據(jù)哈肖,一些簡(jiǎn)單的數(shù)據(jù)(NSString類型的)例如密碼,網(wǎng)址等念秧,NSUserDefaults肯定是首選淤井,但是如果我們自定義了一個(gè)對(duì)象,對(duì)象保存的是一些信息,這時(shí)候就不能直接存儲(chǔ)到NSUserDefaults了

一币狠、了解NSUserDefaults以及它可以直接存儲(chǔ)的類型

NSUserDefaults是一個(gè)單例缎除,在整個(gè)程序中只有一個(gè)實(shí)例對(duì)象,他可以用于數(shù)據(jù)的永久保存总寻,而且簡(jiǎn)單實(shí)用器罐,這是它可以讓數(shù)據(jù)自由傳遞的一個(gè)前提,也是大家喜歡用它保存簡(jiǎn)單數(shù)據(jù)的一個(gè)主要原因渐行。

使用 NSUserDefaults 存儲(chǔ)自定義對(duì)象的最初轰坊,我們必須認(rèn)識(shí)NSUserDefaults可以存儲(chǔ)哪一些類型的數(shù)據(jù),下面一一列出:

NSUserDefaults支持的數(shù)據(jù)類型有:

NSNumber(NSInteger祟印、float肴沫、double),NSString蕴忆,NSDate颤芬,NSArray,NSDictionary套鹅,BOOL.

如果想要將上述數(shù)據(jù)類型的數(shù)據(jù)永久保存到NSUserDefaults中去站蝠,只需要簡(jiǎn)單的操作(一個(gè)Value 一個(gè)Key ),例如,想要保存一個(gè)NSString的對(duì)象卓鹿,代碼實(shí)現(xiàn)為:

//將NSString 對(duì)象存儲(chǔ)到 NSUserDefaults 中

NSString *passWord = @"1234567";

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

[user setObject:passWord forKey:@"userPassWord"];

將數(shù)據(jù)取出也很簡(jiǎn)單菱魔,只需要取出key 對(duì)應(yīng)的值就好了,代碼如下:

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

NSString *passWord = [ user objectForKey:@"userPassWord"];

注意:對(duì)相同的Key賦值約等于一次覆蓋吟孙,要保證每一個(gè)Key的唯一性

值得注意的是:

NSUserDefaults 存儲(chǔ)的對(duì)象全是不可變的(這一點(diǎn)非常關(guān)鍵澜倦,弄錯(cuò)的話程序會(huì)出bug),例如杰妓,如果我想要存儲(chǔ)一個(gè) NSMutableArray 對(duì)象藻治,我必須先創(chuàng)建一個(gè)不可變數(shù)組(NSArray)再將它存入NSUserDefaults中去,代碼如下:

NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"123",@"234", nil];

NSArray * array = [NSArray arrayWithArray:mutableArray];

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

[user setObject:array forKey:@"記住存放的一定是不可變的"];

取出數(shù)據(jù)是一樣的巷挥,想要用NSUserDefaults中的數(shù)據(jù)給可變數(shù)組賦值

先給出一個(gè)錯(cuò)誤的寫法:

/-------------------------錯(cuò)誤的賦值方法-------------------/

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

//這樣寫后桩卵,mutableArray 就變成了不可變數(shù)組了,如果你要在數(shù)組中添加或刪除數(shù)據(jù)就會(huì)出現(xiàn)bug

NSMutableArray *mutableArray = [user objectForKey:@"記住存放的一定是不可變的"];

正確的寫法:

/-------------------------正確的賦值方法-------------------/

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
//可以用alloc 方法代替

NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:[user objectForKey:@"記住存放的一定是不可變的"]];

二句各、使用 NSUserDefaults 存儲(chǔ)自定義對(duì)象

1吸占、將自定義類型轉(zhuǎn)換為NSData類型

當(dāng)數(shù)據(jù)重復(fù)而且多的時(shí)候(例如想存儲(chǔ)全班同學(xué)的學(xué)號(hào),姓名凿宾,性別(這個(gè)數(shù)據(jù)量可能太大了 ))矾屯,如果不用SQLite 存儲(chǔ) (多數(shù)據(jù)最好還是用這個(gè)),你可以選擇使用歸檔初厚,再將文件寫入本地件蚕,但是這種方式和 NSUserDefaults 比起來(lái)麻煩多了(因?yàn)镹SFileManage 本來(lái)就挺復(fù)雜) 孙技,但是問題是,NSUserDefaults 本身不支持自定義對(duì)象的存儲(chǔ)排作,不過它支持NSData的類型牵啦,下面舉一個(gè)例子來(lái)介紹。

我們先建立一個(gè)叫Student 的類妄痪,這個(gè)類里有三個(gè)屬性(學(xué)號(hào)哈雏,姓名,性別),如圖:

我們要做的就是將Student類型變成NSData類型 衫生,那么就必須實(shí)現(xiàn)歸檔:

這里要實(shí)現(xiàn) 在.h 文件中申明 NSCoding 協(xié)議裳瘪,再 在 .m 中實(shí)現(xiàn) encodeWithCoder 方法 和initWithCoder 方法就可以了 :

.h 中修改文件如圖 :

.m中加入代碼 :

這樣做就可以將自定義類型轉(zhuǎn)變?yōu)镹SData類型了
2、將自定義類型數(shù)據(jù)存入 NSUserDefaults 中

如果要存儲(chǔ)全班同學(xué)的信息罪针,我們可以建一個(gè)NSMutableArray 來(lái)存放全班同學(xué)的信息(里面存儲(chǔ)的全是NSData對(duì)象)在需要存儲(chǔ)的地方加入代碼:

//首先彭羹,要建立一個(gè)可變數(shù)組來(lái)存儲(chǔ) NSDate對(duì)象

Student *student = [[Student alloc] ini];

//下面進(jìn)行的是對(duì)student對(duì)象的 name , studentNumber 泪酱,sex 的賦值

student.name = @"lady-奕奕";

student.studentNumber = @"3100104006";

student.sex = @"女";
//這是一個(gè)存放全班同學(xué)的數(shù)組

NSMutableArray * dataArray = [NSMutableArray arrayWithCapacity:50];
//將student類型變?yōu)镹SData類型

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:student];
//存放數(shù)據(jù)的數(shù)組將data加入進(jìn)去

[dataArray addObject:data];
如果你只想存一個(gè)人的信息派殷,你可以直接將NSData存入NSUserDefaults中 :

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:student];

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

[user setObject:data forKey:@"oneStudent"];

如果你想存儲(chǔ)全班同學(xué)的信息,你還要用一個(gè)for循環(huán)將data 放入 dataArray中墓阀,這里具體的操作就不實(shí)現(xiàn)了毡惜,只給出存放的代碼:

//記住要轉(zhuǎn)換成不可變數(shù)組類型

NSArray * array = [NSArray arrayWithArray:dataArray];

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

[user setObject:array forKey:@"allStudent"];
從NSUserDefaults中取出數(shù)據(jù)在還原也很簡(jiǎn)單

例如還原一個(gè)學(xué)生的數(shù)據(jù):

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

NSdData *data = [user objectForKey:@"oneStudent"];

Student *student = [NSKeyedUnarchiver unarchiveObjectWithData:data];

總之,NSUserDefaults 在我們編寫代碼中是最常用的一個(gè)永久保存數(shù)據(jù)的方法岂津,也是最簡(jiǎn)單的虱黄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末悦即,一起剝皮案震驚了整個(gè)濱河市吮成,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辜梳,老刑警劉巖粱甫,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異作瞄,居然都是意外死亡茶宵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門宗挥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)乌庶,“玉大人,你說(shuō)我怎么就攤上這事契耿÷鞔螅” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵搪桂,是天一觀的道長(zhǎng)透敌。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么酗电? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任魄藕,我火速辦了婚禮,結(jié)果婚禮上撵术,老公的妹妹穿的比我還像新娘背率。我一直安慰自己,他們只是感情好嫩与,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布退渗。 她就那樣靜靜地躺著,像睡著了一般蕴纳。 火紅的嫁衣襯著肌膚如雪会油。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天古毛,我揣著相機(jī)與錄音翻翩,去河邊找鬼。 笑死稻薇,一個(gè)胖子當(dāng)著我的面吹牛嫂冻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播塞椎,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼桨仿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了案狠?” 一聲冷哼從身側(cè)響起服傍,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎骂铁,沒想到半個(gè)月后吹零,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拉庵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年灿椅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钞支。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡茫蛹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出烁挟,到底是詐尸還是另有隱情婴洼,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布信夫,位于F島的核電站窃蹋,受9級(jí)特大地震影響卡啰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜警没,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一匈辱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧杀迹,春花似錦亡脸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至续语,卻和暖如春垂谢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疮茄。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工滥朱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人力试。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓徙邻,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親畸裳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缰犁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

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