国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

NSUserDefaults 簡(jiǎn)介,使用 NSUserDefaults 存儲(chǔ)自定義對(duì)象

2019-11-09 15:02:51
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
摘要: NSUserDefaults適合存儲(chǔ)輕量級(jí)的本地?cái)?shù)據(jù),一些簡(jiǎn)單的數(shù)據(jù)(NSString類型的)例如密碼,網(wǎng)址等,NSUserDefaults肯定是首選,但是如果我們自定義了一個(gè)對(duì)象,對(duì)象保存的是一些信息,這時(shí)候就不能直接存儲(chǔ)到NSUserDefaults了

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

      NSUserDefaults是一個(gè)單例,在整個(gè)程序中只有一個(gè)實(shí)例對(duì)象,他可以用于數(shù)據(jù)的永久保存,而且簡(jiǎn)單實(shí)用,這是它可以讓數(shù)據(jù)自由傳遞的一個(gè)前提,也是大家喜歡用它保存簡(jiǎn)單數(shù)據(jù)的一個(gè)主要原因。     

      使用 NSUserDefaults 存儲(chǔ)自定義對(duì)象的最初,我們必須認(rèn)識(shí)NSUserDefaults可以存儲(chǔ)哪一些類型的數(shù)據(jù),下面一一列出:

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

        如果想要將上述數(shù)據(jù)類型的數(shù)據(jù)永久保存到NSUserDefaults中去,只需要簡(jiǎn)單的操作(一個(gè)Value 一個(gè)Key ),例如,想要保存一個(gè)NSString的對(duì)象,代碼實(shí)現(xiàn)為:

    //將NSString 對(duì)象存儲(chǔ)到 NSUserDefaults 中    NSString *passWord = @"1234567";    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];    [user setObject:passWord forKey:@"userPassWord"];

    將數(shù)據(jù)取出也很簡(jiǎn)單,只需要取出key 對(duì)應(yīng)的值就好了,代碼如下:

    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];    NSString *passWord = [ user objectForKey:@"userPassWord"];

注意:對(duì)相同的Key賦值約等于一次覆蓋,要保證每一個(gè)Key的唯一性

值得注意的是:

        NSUserDefaults 存儲(chǔ)的對(duì)象全是不可變的(這一點(diǎn)非常關(guān)鍵,弄錯(cuò)的話程序會(huì)出bug),例如,如果我想要存儲(chǔ)一個(gè) NSMutableArray 對(duì)象,我必須先創(chuàng)建一個(gè)不可變數(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ù)組賦值

先給出一個(gè)錯(cuò)誤的寫(xiě)法:

    /*-------------------------錯(cuò)誤的賦值方法-------------------*/    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];        //這樣寫(xiě)后,mutableArray 就變成了不可變數(shù)組了,如果你要在數(shù)組中添加或刪除數(shù)據(jù)就會(huì)出現(xiàn)bug    NSMutableArray *mutableArray = [user objectForKey:@"記住存放的一定是不可變的"];

正確的寫(xiě)法:

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

二、使用 NSUserDefaults 存儲(chǔ)自定義對(duì)象

1、將自定義類型轉(zhuǎn)換為NSData類型

      當(dāng)數(shù)據(jù)重復(fù)而且多的時(shí)候(例如想存儲(chǔ)全班同學(xué)的學(xué)號(hào),姓名,性別(這個(gè)數(shù)據(jù)量可能太大了 )),如果不用SQLite 存儲(chǔ) (多數(shù)據(jù)最好還是用這個(gè)),你可以選擇使用歸檔,再將文件寫(xiě)入本地,但是這種方式和 NSUserDefaults 比起來(lái)麻煩多了(因?yàn)镹SFileManage 本來(lái)就挺復(fù)雜) ,但是問(wèn)題是,NSUserDefaults 本身不支持自定義對(duì)象的存儲(chǔ),不過(guò)它支持NSData的類型,下面舉一個(gè)例子來(lái)介紹。

我們先建立一個(gè)叫Student 的類,這個(gè)類里有三個(gè)屬性(學(xué)號(hào),姓名,性別),如圖:

我們要做的就是將Student類型變成NSData類型 ,那么就必須實(shí)現(xiàn)歸檔:

這里要實(shí)現(xiàn) 在.h 文件中申明 NSCoding 協(xié)議,再 在 .m 中實(shí)現(xiàn) encodeWithCoder 方法 和 

initWithCoder 方法就可以了 : 

.h 中修改文件如圖 :

.m中加入代碼 :

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

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

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

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

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

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

如果你想存儲(chǔ)全班同學(xué)的信息,你還要用一個(gè)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ù)在還原也很簡(jiǎn)單

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

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

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

? 著作權(quán)歸作者所有分類:ios實(shí)戰(zhàn) 字?jǐn)?shù):1233標(biāo)簽: NSUserDefaults 存儲(chǔ)自定義對(duì)象
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 沿河| 连山| 蓬莱市| 连平县| 固镇县| 正宁县| 吴旗县| 湖南省| 庆云县| 竹山县| 甘肃省| 南岸区| 晴隆县| 旬阳县| 曲水县| 灌云县| 达州市| 全椒县| 伊春市| 镇远县| 水富县| 金山区| 曲阜市| 信阳市| 陇西县| 三都| 青龙| 本溪| 聂荣县| 吐鲁番市| 会理县| 邢台市| 都江堰市| 丹凤县| 灌云县| 海伦市| 深水埗区| 周口市| 诸暨市| 成都市| 阿拉善左旗|