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”