NSUserDefaults簡介

NSUserDefaults是單例類。在整個程序中只有一個實例對象落塑,可以用于數(shù)據(jù)的永久保存窗声,顧大家喜歡用它保存簡單數(shù)據(jù)巧颈。它支持的數(shù)據(jù)類型有:NSNumber(NSInteger、float兜粘、double)申窘,NSString,NSDate孔轴,NSArray剃法,NSDictionary,BOOL路鹰。如果想要將這些數(shù)據(jù)類型的數(shù)據(jù)永久保存到NSUserDefaults中去贷洲,只需要簡單的操作(一個Value 一個Key )。

? ? ? ?NSString *passWord = @"123";

? ? ? ?NSUserDefaults *user = [NSUserDefaults standarUserDefaults];

? ? ? ?[user setObject:passWord forKey:@"userPassWord"];

單例類:是單例模式的一個實例晋柱,而模式單例是一種常見的編程方式优构。在iOS中,單例模式很常見雁竞,它用于確保特定類只有一個實例钦椭。單例最常用于表示硬件或者操作系統(tǒng)向應用程序提供的服務。

NSUerDefaults類提供了一個默認的 系統(tǒng)編程接口進行交互,可以說是最簡單的存儲方式之一玉凯,一般用來存儲應用程序相關(guān)的偏好設(shè)置势腮,配置數(shù)據(jù)等,以便于下次啟動程序之后能恢復上次的設(shè)置漫仆。而且它可以在程序的任何地方存儲和讀取數(shù)據(jù)捎拯。在運行時,可以使用NSUerDefaults對象讀取應用程序的默認數(shù)據(jù)庫來獲取數(shù)據(jù)盲厌。NSUerDefaults具有緩存機制署照,所以不必再每次讀取數(shù)據(jù)的時候都打開應用程序的默認設(shè)置數(shù)據(jù)庫÷鸷疲可以通過synchronize方法來使內(nèi)存中的緩存與系統(tǒng)默認數(shù)據(jù)庫進行同步建芙。

值得注意的是:

NSUserDefaults 存儲的對象全是不可變的(這一點非常關(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類型

當數(shù)據(jù)重復而且多的時候(例如想存儲全班同學的學號,姓名灾挨,性別(這個數(shù)據(jù)量可能太大了 ))邑退,如果不用SQLite 存儲 (多數(shù)據(jù)最好還是用這個),你可以選擇使用歸檔劳澄,再將文件寫入本地地技,但是這種方式和 NSUserDefaults 比起來麻煩多了(因為NSFileManage 本來就挺復雜) ,但是問題是秒拔,NSUserDefaults 本身不支持自定義對象的存儲乓土,不過它支持NSData的類型。我們要做的就是將自定義類型變成NSData類型 溯警,這里要實現(xiàn) 在.h 文件中申明 NSCoding 協(xié)議趣苏,再 在 .m 中實現(xiàn) encodeWithCoder 方法 和initWithCoder 方法就可以將自定義類型轉(zhuǎn)化為類型了。

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

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

//首先,要建立一個可變數(shù)組來存儲 NSDate對象

Student *student = [[Student alloc] init];

//下面進行的是對student對象的 name 喳挑, studentNumber 彬伦,sex 的賦值

student.name = @"WJX";

student.studentNumber = @"123";

student.sex = @"男";

//這是一個存放全班同學的數(shù)組

NSMutableArray * dataArray = [NSMutableArray arrayWithCapacity:0];

//將student類型變?yōu)镹SData類型

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:student];

//存放數(shù)據(jù)的數(shù)組將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中单绑,這里具體的操作就不實現(xiàn)了回官,只給出存放的代碼:

//記住要轉(zhuǎn)換成不可變數(shù)組類型

NSArray * array = [NSArray arrayWithArray:dataArray];

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

[user setObject:array forKey:@"allStudent"];

從NSUserDefaults中取出數(shù)據(jù)在還原也很簡單

例如還原一個學生的數(shù)據(jù):

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

NSdData *data = [user objectForKey:@"oneStudent"];

Student *student = [NSKeyedUnarchiver unarchiveObjectWithData:data];

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


補充:NSUserDefaults是定時把緩存中的數(shù)據(jù)寫入磁盤的,而不是即時寫入区转,為了防止在寫完NSUserDefaults后程序退出導致的數(shù)據(jù)丟失苔巨,可以在寫入數(shù)據(jù)后使用synchronize強制立即將數(shù)據(jù)寫入磁盤

[user synchronize]; 運行上面的語句后(這里的user指的是NSUserDefaults的指針),NSUserDefaults中的數(shù)據(jù)即被寫入到.plist文件中废离,如果是在模擬器上運行程序侄泽,可以在Mac的/Users/YOUR-USERNAME/Library/Application Support/iPhone Simulator/4.1/Applications/YOUR-APP-DIR/Library/Prefereces目錄下面找到一個文件名為YOUR-Bundle_Identifier.plist的plist文件,用Xcode打開該文件蜻韭,可以看到剛才寫入的數(shù)據(jù)悼尾。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市肖方,隨后出現(xiàn)的幾起案子闺魏,更是在濱河造成了極大的恐慌,老刑警劉巖窥妇,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舷胜,死亡現(xiàn)場離奇詭異娩践,居然都是意外死亡活翩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門翻伺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來材泄,“玉大人,你說我怎么就攤上這事吨岭±冢” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵辣辫,是天一觀的道長旦事。 經(jīng)常有香客問我,道長急灭,這世上最難降的妖魔是什么姐浮? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮葬馋,結(jié)果婚禮上卖鲤,老公的妹妹穿的比我還像新娘肾扰。我一直安慰自己,他們只是感情好蛋逾,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布集晚。 她就那樣靜靜地躺著,像睡著了一般区匣。 火紅的嫁衣襯著肌膚如雪偷拔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天沉颂,我揣著相機與錄音条摸,去河邊找鬼。 笑死铸屉,一個胖子當著我的面吹牛钉蒲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播彻坛,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼顷啼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了昌屉?” 一聲冷哼從身側(cè)響起钙蒙,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎间驮,沒想到半個月后躬厌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡竞帽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年扛施,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屹篓。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡疙渣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出堆巧,到底是詐尸還是另有隱情妄荔,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布谍肤,位于F島的核電站啦租,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏荒揣。R本人自食惡果不足惜篷角,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乳附。 院中可真熱鬧内地,春花似錦伴澄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荆针,卻和暖如春敞嗡,著一層夾襖步出監(jiān)牢的瞬間症汹,已是汗流浹背潘悼。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留禀晓,地道東北人玖媚。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓箕肃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親今魔。 傳聞我的和親對象是個殘疾皇子勺像,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內(nèi)容