NSUserDefaults 簡介

轉載自:NSUserDefaults 簡介啤握,使用 NSUserDefaults 存儲自定義對象

一、了解NSUserDefaults以及它可以直接存儲的類型

NSUserDefaults是一個單例缩擂,在整個程序中只有一個實例對象优幸,他可以用于數據的永久保存寂纪,而且簡單實用,這是它可以讓數據自由傳遞的一個前提夭织,也是大家喜歡用它保存簡單數據的一個主要原因吭露。
使用NSUserDefaults存儲自定義對象的最初,我們必須認識NSUserDefaults可以存儲哪一些類型的數據:
NSNumberNSInteger尊惰、float讲竿、double)、NSString弄屡、NSDate题禀、NSArrayNSDictionary琢岩、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 存儲自定義對象

  1. 將自定義類型轉換為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類型了宪赶。

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市楣铁,隨后出現的幾起案子玖雁,更是在濱河造成了極大的恐慌,老刑警劉巖面殖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辽幌,死亡現場離奇詭異虑润,居然都是意外死亡,警方通過查閱死者的電腦和手機冗澈,發(fā)現死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門腐缤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陨溅,“玉大人雹有,你說我怎么就攤上這事溜宽。” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長杰标。 經常有香客問我,道長桶蝎,這世上最難降的妖魔是什么毡泻? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任丹墨,我火速辦了婚禮,結果婚禮上卵迂,老公的妹妹穿的比我還像新娘挂疆。我一直安慰自己缤言,他們只是感情好宝当,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布墨闲。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腾仅。 梳的紋絲不亂的頭發(fā)上验辞,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天陵珍,我揣著相機與錄音,去河邊找鬼违施。 笑死互纯,一個胖子當著我的面吹牛,可吹牛的內容都是我干的亿卤。 我是一名探鬼主播愤兵,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼排吴!你這毒婦竟也來了?” 一聲冷哼從身側響起懦鼠,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤钻哩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后肛冶,有當地人在樹林里發(fā)現了一具尸體街氢,經...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年睦袖,在試婚紗的時候發(fā)現自己被綠了珊肃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖伦乔,靈堂內的尸體忽然破棺而出厉亏,到底是詐尸還是另有隱情,我是刑警寧澤烈和,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布爱只,位于F島的核電站,受9級特大地震影響招刹,放射性物質發(fā)生泄漏恬试。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一疯暑、第九天 我趴在偏房一處隱蔽的房頂上張望训柴。 院中可真熱鬧,春花似錦妇拯、人聲如沸畦粮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宣赔。三九已至,卻和暖如春瞪浸,著一層夾襖步出監(jiān)牢的瞬間儒将,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工对蒲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钩蚊,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓蹈矮,卻偏偏與公主長得像砰逻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子泛鸟,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內容