NSUserDefaults 簡介,使用 NSUserDefaults 存儲自定義對象

NSUserDefaults適合存儲輕量級的本地?cái)?shù)據(jù)悴侵,一些簡單的數(shù)據(jù)(NSString類型的)例如密碼瞧剖,網(wǎng)址等,NSUserDefaults肯定是首選,但是如果我們自定義了一個(gè)對象抓于,對象保存的是一些信息做粤,這時(shí)候就不能直接存儲到NSUserDefaults了

一、了解NSUserDefaults以及它可以直接存儲的類型

NSUserDefaults是一個(gè)單例捉撮,在整個(gè)程序中只有一個(gè)實(shí)例對象怕品,他可以用于數(shù)據(jù)的永久保存,而且簡單實(shí)用巾遭,這是它可以讓數(shù)據(jù)自由傳遞的一個(gè)前提肉康,也是大家喜歡用它保存簡單數(shù)據(jù)的一個(gè)主要原因。

使用 NSUserDefaults 存儲自定義對象的最初灼舍,我們必須認(rèn)識NSUserDefaults可以存儲哪一些類型的數(shù)據(jù)吼和,下面一一列出:

NSUserDefaults支持的數(shù)據(jù)類型有:NSNumber(NSInteger、float骑素、double)炫乓,NSString,NSDate献丑,NSArray厢岂,NSDictionary,BOOL.

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

//將NSString 對象存儲到 NSUserDefaults 中

NSString *passWord = @"1234567";

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

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

將數(shù)據(jù)取出也很簡單筐摘,只需要取出key 對應(yīng)的值就好了,代碼如下:

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

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

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

值得注意的是:

NSUserDefaults 存儲的對象全是不可變的(這一點(diǎn)非常關(guān)鍵咖熟,弄錯的話程序會出bug),例如柳畔,如果我想要存儲一個(gè) NSMutableArray 對象馍管,我必須先創(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è)錯誤的寫法:

/*-------------------------錯誤的賦值方法-------------------*/

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

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

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

正確的寫法:

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

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

//可以用alloc 方法代替

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

二俘陷、使用 NSUserDefaults 存儲自定義對象

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

當(dāng)數(shù)據(jù)重復(fù)而且多的時(shí)候(例如想存儲全班同學(xué)的學(xué)號,姓名拉盾,性別(這個(gè)數(shù)據(jù)量可能太大了 ))桨菜,如果不用SQLite 存儲 (多數(shù)據(jù)最好還是用這個(gè)),你可以選擇使用歸檔,再將文件寫入本地倒得,但是這種方式和 NSUserDefaults 比起來麻煩多了(因?yàn)镹SFileManage 本來就挺復(fù)雜) 泻红,但是問題是,NSUserDefaults 本身不支持自定義對象的存儲霞掺,不過它支持NSData的類型谊路,下面舉一個(gè)例子來介紹。

我們先建立一個(gè)叫Student 的類根悼,這個(gè)類里有三個(gè)屬性(學(xué)號凶异,姓名,性別),如圖:

我們要做的就是將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 中

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

//首先喉恋,要建立一個(gè)可變數(shù)組來存儲 NSDate對象

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

//下面進(jìn)行的是對student對象的 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"];

如果你想存儲全班同學(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ù)在還原也很簡單

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

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

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

Student *student = [NSKeyedUnarchiver unarchiveObjectWithData:data];

總之,NSUserDefaults 在我們編寫代碼中是最常用的一個(gè)永久保存數(shù)據(jù)的方法业舍,也是最簡單的抖拦。

轉(zhuǎn)載自“http://my.oschina.net/u/1245365/blog/294449

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市舷暮,隨后出現(xiàn)的幾起案子态罪,更是在濱河造成了極大的恐慌,老刑警劉巖下面,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件复颈,死亡現(xiàn)場離奇詭異,居然都是意外死亡沥割,警方通過查閱死者的電腦和手機(jī)耗啦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來机杜,“玉大人芹彬,你說我怎么就攤上這事〔媛” “怎么了舒帮?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我玩郊,道長肢执,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任译红,我火速辦了婚禮预茄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘侦厚。我一直安慰自己耻陕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布刨沦。 她就那樣靜靜地躺著诗宣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪想诅。 梳的紋絲不亂的頭發(fā)上召庞,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機(jī)與錄音来破,去河邊找鬼篮灼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛徘禁,可吹牛的內(nèi)容都是我干的诅诱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼送朱,長吁一口氣:“原來是場噩夢啊……” “哼娘荡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起骤菠,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎疤孕,沒想到半個(gè)月后商乎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祭阀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年鹉戚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片专控。...
    茶點(diǎn)故事閱讀 38,643評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抹凳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出伦腐,到底是詐尸還是另有隱情赢底,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站幸冻,受9級特大地震影響粹庞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜洽损,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一庞溜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧碑定,春花似錦流码、人聲如沸芍殖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽什荣。三九已至访娶,卻和暖如春商虐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背崖疤。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工秘车, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人劫哼。 一個(gè)月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓叮趴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親权烧。 傳聞我的和親對象是個(gè)殘疾皇子眯亦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評論 2 348

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