摘要: NSUserDefaults适合存儲輕量級的本地資料,一些簡單的資料(NSString類型的)例如密碼,網址等,NSUserDefaults肯定是首選,但是如果我們自定義了一個對象,對象儲存的是一些資訊,這時候就不能直接存儲到NSUserDefaults了
一、了解NSUserDefaults以及它可以直接存儲的類型
NSUserDefaults是一個單例,在整個程式中隻有一個執行個體對象,他可以用于資料的永久儲存,而且簡單實用,這是它可以讓資料自由傳遞的一個前提,也是大家喜歡用它儲存簡單資料的一個主要原因。
使用 NSUserDefaults 存儲自定義對象的最初,我們必須認識NSUserDefaults可以存儲哪一些類型的資料,下面一一列出:
NSUserDefaults支援的資料類型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL.
如果想要将上述資料類型的資料永久儲存到NSUserDefaults中去,隻需要簡單的操作(一個Value 一個Key ),例如,想要儲存一個NSString的對象,代碼實作為:
//将NSString 對象存儲到 NSUserDefaults 中
NSString *passWord = @"1234567";
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject:passWord forKey:@"userPassWord"];
将資料取出也很簡單,隻需要取出key 對應的值就好了,代碼如下:
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
NSString *passWord = [ user objectForKey:@"userPassWord"];
注意:對相同的Key指派約等于一次覆寫,要保證每一個Key的唯一性
值得注意的是:
NSUserDefaults 存儲的對象全是不可變的(這一點非常關鍵,弄錯的話程式會出bug),例如,如果我想要存儲一個 NSMutableArray
對象,我必須先建立一個不可變數組(NSArray)再将它存入NSUserDefaults中去,代碼如下:
NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"123",@"234", nil];
NSArray * array = [NSArray arrayWithArray:mutableArray];
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject:array forKey:@"記住存放的一定是不可變的"];
取出資料是一樣的,想要用NSUserDefaults中的資料給可變數組指派
先給出一個錯誤的寫法:
/*-------------------------錯誤的指派方法-------------------*/
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
//這樣寫後,mutableArray 就變成了不可變數組了,如果你要在數組中添加或删除資料就會出現bug
NSMutableArray *mutableArray = [user objectForKey:@"記住存放的一定是不可變的"];
正确的寫法:
/*-------------------------正确的指派方法-------------------*/
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
//可以用alloc 方法代替
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:[user objectForKey:@"記住存放的一定是不可變的"]];
二、使用 NSUserDefaults 存儲自定義對象
1、将自定義類型轉換為NSData類型
當資料重複而且多的時候(例如想存儲全班同學的學号,姓名,性别(這個資料量可能太大了 )),如果不用SQLite 存儲 (多資料最好還是用這個),你可以選擇使用歸檔,再将檔案寫入本地,但是這種方式和 NSUserDefaults 比起來麻煩多了(因為NSFileManage
本來就挺複雜) ,但是問題是,NSUserDefaults 本身不支援自定義對象的存儲,不過它支援NSData的類型,下面舉一個例子來介紹。
我們先建立一個叫Student 的類,這個類裡有三個屬性(學号,姓名,性别),如圖:

我們要做的就是将Student類型變成NSData類型 ,那麼就必須實作歸檔:
這裡要實作 在.h 檔案中申明 NSCoding 協定,再 在 .m 中實作 encodeWithCoder 方法
和
initWithCoder 方法就可以了 :
.h 中修改檔案如圖 :
.m中加入代碼 :
這樣做就可以将自定義類型轉變為NSData類型了
2、将自定義類型資料存入 NSUserDefaults 中
如果要存儲全班同學的資訊,我們可以建一個NSMutableArray 來存放全班同學的資訊(裡面存儲的全是NSData對象)在需要存儲的地方加入代碼:
//首先,要建立一個可變數組來存儲 NSDate對象
Student *student = [[Student alloc] ini];
//下面進行的是對student對象的 name , studentNumber ,sex 的指派
student.name = @"lady-奕奕";
student.studentNumber = @"3100104006";
student.sex = @"女";
//這是一個存放全班同學的數組
NSMutableArray * dataArray = [NSMutableArray arrayWithCapacity:50];
//将student類型變為NSData類型
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:student];
//存放資料的數組将data加入進去
[dataArray addObject:data];
如果你隻想存一個人的資訊,你可以直接将NSData存入NSUserDefaults中 :
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:student];
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject:data forKey:@"oneStudent"];
如果你想存儲全班同學的資訊,你還要用一個for循環将data 放入 dataArray中,這裡具體的操作就不實作了,隻給出存放的代碼:
//記住要轉換成不可變數組類型
NSArray * array = [NSArray arrayWithArray:dataArray];
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject:array forKey:@"allStudent"];
從NSUserDefaults中取出資料在還原也很簡單
例如還原一個學生的資料:
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
NSdData *data = [user objectForKey:@"oneStudent"];
Student *student = [NSKeyedUnarchiver unarchiveObjectWithData:data];
總之,NSUserDefaults 在我們編寫代碼中是最常用的一個永久儲存資料的方法,也是最簡單的。