NSUserDefaults適合存儲輕量級的本地數據,一些簡單的數據(NSString類型的)例如密碼,網址等,NSUserDefaults肯定是首選,但是如果我們自定義了一個對象,對象保存的是一些信息,這時候就不能直接存儲到NSUserDefaults了.
一.了解NSUserDefaults以及它可以直接存儲的類型
NSUserDefaults是一個單例,在整個程序中只有一個實力對象,他可以用于數據的永久保存,而且簡單實用,這是它可以讓數據自由傳遞的一個前提,也是大家喜歡用它保存簡單數據的一個主要原因.
NSUserDefaults支持的數據類型有
NSNumber(NSInteger,float,double),NSString,NSDate,NSArray,NSDictionary,BOOL
如果想要將上述數據類型的數據永久保存到NSUserDefaults中去,只需要簡單的操作(一個Value和一個Key),例如,想要保存一個NSString的對象,代碼實現為:
+(void)SetLoginToken:(NSString *)loginToken{
NSUserDefaults *userToken = [NSUserDefaults standardUserDefaults];
[userToken setObject:loginToken forKey:@"loginToken"];
[userToken synchronize];
}
將數據取出的方式,只需要取出對應的key值就好了,代碼如下:
+(NSString *)GetToken
{
NSUserDefaults *userToken = [NSUserDefaults standardUserDefaults];
NSString * token = [userToken objectForKey:@"userToken"];
return token;
}
此處要注意:對于相同的Key賦值約等于一次覆蓋,要保證每一個Key的唯一性
NSUserDefaults存儲的對象全是不可變的(這一點非常關鍵,弄錯的話程序會出bug),例如,如果我想要存儲一個NSMutableArray對象,我必須先創建一個不可變數組(NSArray)再將它存入NSUserDefaults中去,代碼如下:
NSMutableArray * mutableArray = [NSMutableArray arrayWithObjects: @"123",@"435", nil];
NSArray * array = [NSArray arrayWithArray:mutableArray];
[[NSUserDefaults standardUserDefaults] setObject:array forKey:@"注意存放對象是不可變的"];
取出數據是一樣的,想要用NSUserDefaults中的數據給可變數組賦值,先給出一個錯誤的寫法:
正確的寫法:
二.使用NSUserDefaults存儲自定義對象
1.將自定義類型轉換為NSData類型
當數據重復而且多的時候(例如想存儲全班同學的學好,姓名,性別(這個數據量可能太大了)),吐過不用SQLite存儲(多數據最好還是用數據庫),你可以選擇使用歸檔,再將文件寫入本地,但是這種方式和NSUserDefaults比起來麻煩多了(因為NSFileManager本來就挺復雜的),但是問題是,NSUserDefaults本身并不支持自定義對象的存儲,不過它支持NSData的類型,下面舉一個例子來介紹:
我們先建立一個叫Student的類,這個類里面有三個屬性(學號,姓名,性別),如圖:
我們要做的是將Student類型變成NSData類型,那么就必須實現歸檔:
這里要實現在.h文件中申明NSCoding協議,再在.m中實現encodeWithCoder方法和initWithCoder方法就可以了:
.h中修改文件如圖所示:
m中寫入代碼:
這樣就可以將自定義類型轉變成NSData類型了
2.將自定義類型數據存入NSUserDefaults中
如果要存儲全班同學的信息,我們可以建一個NSMutableArray來存放全班同學的信息(里面存儲的全是NSData對象)在需要存儲的地方加入代碼
從NSUserDefaults中取出數據再還原也比較簡單:
例如還原一個學生的數據:
或者還原一個班級中某個學生的數據:
NSUserDefaults是我們在編寫代碼中最常用的一個永久保存數據的方法,也是最簡單的.