轉載自: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
對象安券,我必須先創(chuàng)建一個不可變數組(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 存儲自定義對象
- 將自定義類型轉換為
NSData
類型
當數據重復而且多的時候(例如想存儲全班同學的學號址貌、姓名铐拐、性別),如果不用SQLite
存儲(多數據最好還是用這個)练对,你可以選擇使用歸檔遍蟋,再將文件寫入本地。但是這種方式和NSUserDefaults
比起來麻煩多了螟凭,因為NSFileManage
本來就挺復雜虚青。但問題是,NSUserDefaults
本身不支持自定義對象的存儲螺男,不過它支持NSData
的類型棒厘。下面舉一個例子來介紹钟些。
我們先建立一個叫Student
的類,這個類里有三個屬性(學號绊谭,姓名政恍,性別):
#import "Person.h"
@interface Student : Person
@property(nonatomic, retain) NSString *name;
@property(nonatomic, retain) NSString *studentNumber;
@property(nonatomic, retain) NSString *sex;
@end
我們要將Student
類型變成NSData
類型 ,那么就必須實現歸檔达传。即在.h
文件中申明NSCoding
協(xié)議篙耗,并在.m
文件中實現encodeWithCoder
方法和initWithCoder
方法 。
此時.h
需做相應修改:
#import "Person.h"
@interface Student : Person <NSCoding>
@property(nonatomic, retain) NSString *name;
@property(nonatomic, retain) NSString *studentNumber;
@property(nonatomic, retain) NSString *sex;
@end
并在.m
中加入代碼 :
#import "Student.h"
@implementation Student
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.studentNumber forKey:@"studentNumber"];
[aCoder encodeObject:self.sex forKey:@"sex"];
}
- (id)initWithCoder:(NSCoder *)aDecoder{
if(self = [super init]){
self.name = [aDecoder decodeObjectForKey:@"name"];
self.studentNumber = [aDecoder decodeObjectForKey:@"studentNumber"];
self.sex = [aDecoder decodeObjectForKey:@"sex"];
}
return self;
}
@end
這樣做就可以將自定義類型轉變?yōu)?code>NSData類型了宪赶。
- 將自定義類型數據存入
NSUserDefaults
中
如果要存儲全班同學的信息宗弯,我們可以建一個NSMutableArray
來存放全班同學的信息(里面存儲的全是NSData
對象)在需要存儲的地方加入代碼:
//首先,要建立一個可變數組來存儲 NSDate對象
Student *student = [[Student alloc] ini];
//下面進行的是對student對象的 name搂妻、studentNumber蒙保、sex的賦值
student.name = @"綠谷出久";
student.studentNumber = @"09123379";
student.sex = @"男";
//這是一個存放全班同學的數組
NSMutableArray *dataArray = [NSMutableArray arrayWithCapacity:50];
//將student類型變?yōu)?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
循環(huán)將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
在我們編寫代碼中是最常用的一個永久保存數據的方法,也是最簡單的引几。