NSUserDefaults 簡介,使用 NSUserDefaults 存儲自定義對象

摘要: NSUserDefaults適合存儲輕量級的本地數據,一些簡單的數據(NSString類型的)例如密碼,網址等,NSUserDefaults確定是首選,可是若是咱們自定義了一個對象,對象保存的是一些信息,這時候就不能直接存儲到NSUserDefaults了

1、瞭解NSUserDefaults以及它能夠直接存儲的類型

 

      NSUserDefaults是一個單例,在整個程序中只有一個實例對象,他能夠用於數據的永久保存,並且簡單實用,這是它可讓數據自由傳遞的一個前提,也是你們喜歡用它保存簡單數據的一個主要緣由。     數組

      使用 NSUserDefaults 存儲自定義對象的最初,咱們必須認識NSUserDefaults能夠存儲哪一些類型的數據,下面一一列出:ui

NSUserDefaults支持的數據類型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL.spa

 

        若是想要將上述數據類型的數據永久保存到NSUserDefaults中去,只須要簡單的操做(一個Value 一個Key ),例如,想要保存一個NSString的對象,代碼實現爲:code

 

    //將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的惟一性blog

 

值得注意的是:ci

        NSUserDefaults 存儲的對象全是不可變的(這一點很是關鍵,弄錯的話程序會出bug),例如,若是我想要存儲一個 NSMutableArray 對象,我必須先建立一個不可變數組(NSArray)再將它存入NSUserDefaults中去,代碼以下:string

 

    NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"123",@"234", nil];     NSArray * array = [NSArray arrayWithArray:mutableArray];          NSUserDefaults *user = [NSUserDefaults standardUserDefaults];     [user setObject:array forKey:@"記住存放的必定是不可變的"];

 

 

取出數據是同樣的,想要用NSUserDefaults中的數據給可變數組賦值it

先給出一個錯誤的寫法:io

 

    /*-------------------------錯誤的賦值方法-------------------*/     NSUserDefaults *user = [NSUserDefaults standardUserDefaults];          //這樣寫後,mutableArray 就變成了不可變數組了,若是你要在數組中添加或刪除數據就會出現bug     NSMutableArray *mutableArray = [user objectForKey:@"記住存放的必定是不可變的"];

 

 

 

正確的寫法:

    /*-------------------------正確的賦值方法-------------------*/     NSUserDefaults *user = [NSUserDefaults standardUserDefaults];          //能夠用alloc 方法代替     NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:[user objectForKey:@"記住存放的必定是不可變的"]];

 

 

2、使用 NSUserDefaults 存儲自定義對象

一、將自定義類型轉換爲NSData類型

      當數據重複並且多的時候(例如想存儲全班同窗的學號,姓名,性別(這個數據量可能太大了 )),若是不用SQLite 存儲 (多數據最好仍是用這個),你能夠選擇使用歸檔,再將文件寫入本地,可是這種方式和 NSUserDefaults 比起來麻煩多了(由於NSFileManage 原本就挺複雜) ,可是問題是,NSUserDefaults 自己不支持自定義對象的存儲,不過它支持NSData的類型,下面舉一個例子來介紹。

 

咱們先創建一個叫Student 的類,這個類裏有三個屬性(學號,姓名,性別),如圖:

咱們要作的就是將Student類型變成NSData類型 ,那麼就必須實現歸檔:

這裏要實現 在.h 文件中申明 NSCoding 協議,再 在 .m 中實現 encodeWithCoder 方法 和 

initWithCoder 方法就能夠了 : 

 

.h 中修改文件如圖 :

 

.m中加入代碼 :

這樣作就能夠將自定義類型轉變爲NSData類型了

 

二、將自定義類型數據存入 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 在咱們編寫代碼中是最經常使用的一個永久保存數據的方法,也是最簡單的。

相關文章
相關標籤/搜索