NSUserDefaults 簡介

NSUserDefaults是一個單例,在整個程序中只有一個實(shí)例對象,他可以用于數(shù)據(jù)的永久保存,而且簡單實(shí)用,這是它可以讓數(shù)據(jù)自由傳遞的一個前提,也是大家喜歡用它保存簡單數(shù)據(jù)的一個主要原因。
使用 NSUserDefaults 存儲自定義對象的最初,我們必須認(rèn)識NSUserDefaults可以存儲哪一些類型的數(shù)據(jù),下面一一列出:
NSUserDefaults支持的數(shù)據(jù)類型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL.
如果想要將上述數(shù)據(jù)類型的數(shù)據(jù)永久保存到NSUserDefaults中去,只需要簡單的操作(一個Value 一個Key ),例如,想要保存一個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賦值約等于一次覆蓋,要保證每一個Key的唯一性

值得注意的是:
NSUserDefaults 存儲的對象全是不可變的(這一點(diǎn)非常關(guān)鍵,弄錯的話程序會出bug),例如,如果我想要存儲一個 NSMutableArray 對象,我必須先創(chuàng)建一個不可變數(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ù)組賦值
先給出一個錯誤的寫法:

/*-------------------------錯誤的賦值方法-------------------*/    
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ù)而且多的時候(例如想存儲全班同學(xué)的學(xué)號,姓名,性別(這個數(shù)據(jù)量可能太大了 )),如果不用SQLite 存儲 (多數(shù)據(jù)最好還是用這個),你可以選擇使用歸檔,再將文件寫入本地,但是這種方式和 NSUserDefaults 比起來麻煩多了(因?yàn)镹SFileManage 本來就挺復(fù)雜) ,但是問題是,NSUserDefaults 本身不支持自定義對象的存儲,不過它支持NSData的類型,下面舉一個例子來介紹。
我們先建立一個叫Student 的類,這個類里有三個屬性(學(xué)號,姓名,性別),如下:

@property(nonatomic, strong) NSString *name;
@property(nonatomic, assign) NSString *age;
@property(nonatomic, strong) NSString *sex;

我們要做的就是將Student類型變成NSData類型 ,那么就必須實(shí)現(xiàn)歸檔:
這里要實(shí)現(xiàn) 在.h 文件中申明 NSCoding 協(xié)議,再 在 .m 中實(shí)現(xiàn) encodeWithCoder 方法 和
initWithCoder 方法就可以了 :
.h 中修改文件如下 :

@interface Student : NSObject<NSCoding>

.m中加入代碼 :

- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeObject:self.age forKey:@"age"];
    [aCoder encodeInteger:self.sex forKey:@"sex"];
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self) {
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.age = [aDecoder decodeIntegerForKey:@"age"];
        self.sex = [aDecoder decodeObjectForKey:@"sex"];
    }
    return self;
}

這樣做就可以將自定義類型轉(zhuǎn)變?yōu)镹SData類型了

2.將自定義類型數(shù)據(jù)存入 NSUserDefaults 中

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

//首先,要建立一個可變數(shù)組來存儲 NSDate對象     Student *student = [[Student alloc] ini];        
 //下面進(jìn)行的是對student對象的 name , studentNumber ,sex 的賦值    
 student.name = @"顧二蛋";   
 student.studentNumber = @"201323010100040";   
 student.sex = @"女";        
 //這是一個存放全班同學(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];

如果你只想存一個人的信息,你可以直接將NSData存入NSUserDefaults中 :

  NSData *data = [NSKeyedArchiver archivedDataWithRootObject:student];         
  NSUserDefaults *user = [NSUserDefaults standardUserDefaults];    
  [user setObject:data forKey:@"oneStudent"];

如果你想存儲全班同學(xué)的信息,你還要用一個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ù)在還原也很簡單
例如還原一個學(xué)生的數(shù)據(jù):

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];  
NSdData *data = [user objectForKey:@"oneStudent"];     
Student *student = [NSKeyedUnarchiver unarchiveObjectWithData:data];

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容