iOS數(shù)據(jù)存儲(chǔ)方法(歸檔)

1梦鉴、對(duì)象歸檔

所謂對(duì)象歸檔集绰,類(lèi)似于“序列化”機(jī)制,歸檔就是用某種格式把一個(gè)或多 個(gè)對(duì)象保存到指定文件中,方便以后從文件中恢復(fù)他們嚼贡。

1.1 使用NSKeyedArchiver歸檔

NSKeyedArchiver和NSKeyedUnarchiver

對(duì)系統(tǒng)類(lèi)型直接歸檔

archiveRootObject: toFile:
unarchiveObjectWithFile:

//對(duì)象歸檔
- (void)test5{
    //第一種方法队询,直接調(diào)用NSKeyedArchiver
    //先創(chuàng)建一個(gè)NSDictionary對(duì)象
    NSDictionary *dict = @{
                           @"Objective-C" : @89,
                           @"Rubby" : @69,
                           @"Python" : @75,
                           @"Perl" : @109
                           };
    // 對(duì)dict對(duì)象進(jìn)行歸檔
    NSString *filePath = @"/Users/lwg/Desktop/SettingBundle/SettingBundle/dict.archive";
    [NSKeyedArchiver archiveRootObject:dict toFile:filePath];
    
    // 讀取dict.archive
    NSDictionary *dict1 = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    NSLog(@"%@",dict1);
    
}

1.2 實(shí)現(xiàn)NSCoding協(xié)議

一般來(lái)說(shuō),如果對(duì)象的實(shí)例變量是OC基本類(lèi)型,并且實(shí)現(xiàn)了NSCoding協(xié)議,則可直接調(diào)用encodingObject:forKey:方法來(lái)歸檔該實(shí)例變量,使用decodeObjectForKey:方法恢復(fù)該實(shí)例變量即可擎厢。
如果需要?dú)w檔、恢復(fù)任意自定義類(lèi)的實(shí)例辣吃,那么該類(lèi)型應(yīng)該實(shí)現(xiàn)NSCoding協(xié)議如下兩個(gè)方法:

initWithCoder:
encodeWithCoder:
@interface FKApple : NSObject<NSCoding>

@property (nonatomic,copy) NSString *color;
@property (nonatomic,assign) double weight;
@property (nonatomic,assign) int size;
- (id)initWithColor:(NSString *)color weight:(double)weight size:(int)size;

@end

方法實(shí)現(xiàn)
- (void)encodeWithCoder:(NSCoder *)aCoder{
    //調(diào)用NSCoder的方法歸檔該對(duì)象的每個(gè)實(shí)例變量
    [aCoder encodeObject:_color forKey:@"color"];
    [aCoder encodeDouble:_weight forKey:@"weight"];
    [aCoder encodeInt:_size forKey:@"size"];
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder{
    // 使用NSCoder恢復(fù)color动遭、weight、size這3個(gè)key
    // 所對(duì)應(yīng)的value神得,并將恢復(fù)的value賦給當(dāng)前對(duì)象的3個(gè)實(shí)例變量
    _color = [aDecoder decodeObjectForKey:@"color"];
    _weight = [aDecoder decodeDoubleForKey:@"weight"];
    _size = [aDecoder decodeIntForKey:@"size"];
    return self;
}

1.3使用NSData完成自定義歸檔

上面的方法每次只能將單個(gè)對(duì)象作為root進(jìn)行歸檔或者恢復(fù)厘惦,如果希望一次性收集多個(gè)對(duì)象,并進(jìn)行歸檔到單個(gè)文件中哩簿,可以使用NSMutableData來(lái)創(chuàng)建NSKeyedArchiver和NSKeyedUnarchiver對(duì)象宵蕉。
步驟如下:
1.以NSMutableData作為參數(shù),創(chuàng)建NSKeyedArchiver對(duì)象节榜;
2.重復(fù)調(diào)用NSKeyedArchiver對(duì)象的encodeObject:forKey:方法來(lái)歸檔所有需要?dú)w檔到一個(gè)文件中的對(duì)象羡玛。
3.調(diào)用NSKeyedArchiver對(duì)象的finishEncoding方法結(jié)束歸檔;
4.根據(jù)需要宗苍,程序可以選擇將保存歸檔數(shù)據(jù)的NSData通過(guò)網(wǎng)絡(luò)傳輸或者輸出到磁盤(pán)文件上稼稿。

// 使用NSData完成自定義歸檔
// 一次性將多個(gè)對(duì)象歸檔到單個(gè)文件中
- (void)test6{
    //先創(chuàng)建一個(gè)NSDictionary對(duì)象
    NSDictionary *dict = @{
                           @"Objective-C" : @89,
                           @"Rubby" : @69,
                           @"Python" : @75,
                           @"Perl" : @109
                           };
    // 創(chuàng)建一個(gè)NSSet對(duì)象
    NSSet *set = [NSSet setWithObjects:@"ios",@"Java",@"OC", nil];
    FKApple *apple = [[FKApple alloc] initWithColor:@"紅色" weight:3.4 size:20];
    // 創(chuàng)建一個(gè)NSMutableData對(duì)象,用于保存歸檔數(shù)據(jù)
    NSMutableData *data = [NSMutableData data];
    NSKeyedArchiver *arch = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    
    // 重復(fù)調(diào)用此方法
    [arch encodeObject:dict forKey:@"dict"];
    [arch encodeObject:set forKey:@"set"];
    [arch encodeObject:apple forKey:@"apple"];
    
    [arch finishEncoding];
    
    // 程序?qū)SData緩存區(qū)保存的數(shù)據(jù)寫(xiě)入文件
     NSString *filePath = @"/Users/lwg/Desktop/SettingBundle/SettingBundle/multi.archive";
    if ([data writeToFile:filePath atomically:YES] == NO) {
        NSLog(@"歸檔失敾淇摺让歼!");
    }
    
    // 讀取歸檔
    NSData *data1 = [NSData dataWithContentsOfFile:filePath];
    NSKeyedUnarchiver *unarch = [[NSKeyedUnarchiver alloc] initForReadingWithData:data1];
    NSDictionary *dict1 = [unarch decodeObjectForKey:@"dict"];
    NSSet *set1 = [unarch decodeObjectForKey:@"set"];
    FKApple *apple1 = [unarch decodeObjectForKey:@"apple"];
    [unarch finishDecoding];
    NSLog(@"%@",dict1);
    NSLog(@"%@",set1);
    NSLog(@"%@",apple1);
}

1.4使用歸檔實(shí)現(xiàn)深復(fù)制

當(dāng)程序歸檔一個(gè)對(duì)象時(shí),系統(tǒng)會(huì)把該對(duì)象關(guān)聯(lián)的所有數(shù)據(jù)都轉(zhuǎn)化為字節(jié)數(shù)據(jù)挪钓;如果程序從這些字節(jié)數(shù)據(jù)中恢復(fù)該對(duì)象是越,恢復(fù)出來(lái)的對(duì)象與原對(duì)象完全相同耳舅,但沒(méi)有任何公用的部分碌上,這就實(shí)現(xiàn)了深復(fù)制倚评。

// 利用歸檔實(shí)現(xiàn)深復(fù)制
- (void)deepCopy{
    NSDictionary *dict = @{
                           @"one" : [[FKApple alloc] initWithColor:@"紅色" weight:3.4 size:20],
                           @"two" : [[FKApple alloc] initWithColor:@"綠色" weight:2.8 size:14]
                           };
    // 將歸檔對(duì)象的數(shù)據(jù)寫(xiě)入NSData
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:dict];
    // 從NSData對(duì)象中恢復(fù)對(duì)象,這樣既可完成深復(fù)制
    NSDictionary *dictCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    // 獲取復(fù)制后的對(duì)象
    FKApple *app = [dictCopy objectForKey:@"one"];
    // 修改對(duì)象屬性
    [app setColor:@"紫色"];
    
    // 獲取原始對(duì)象
    FKApple *oneApp = [dict objectForKey:@"one"];
    // 訪(fǎng)問(wèn)該對(duì)象顏色馏予,發(fā)現(xiàn)并沒(méi)有改變
    NSLog(@"dict中key為one對(duì)應(yīng)的顏色為:%@,復(fù)制后的app顏色為:%@",oneApp.color,app.color);
    
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末天梧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子霞丧,更是在濱河造成了極大的恐慌呢岗,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛹尝,死亡現(xiàn)場(chǎng)離奇詭異后豫,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)突那,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)挫酿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人愕难,你說(shuō)我怎么就攤上這事早龟。” “怎么了猫缭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵葱弟,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我猜丹,道長(zhǎng)芝加,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任射窒,我火速辦了婚禮妖混,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘轮洋。我一直安慰自己制市,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布弊予。 她就那樣靜靜地躺著祥楣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪汉柒。 梳的紋絲不亂的頭發(fā)上误褪,一...
    開(kāi)封第一講書(shū)人閱讀 51,258評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音碾褂,去河邊找鬼兽间。 笑死,一個(gè)胖子當(dāng)著我的面吹牛正塌,可吹牛的內(nèi)容都是我干的嘀略。 我是一名探鬼主播恤溶,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼帜羊!你這毒婦竟也來(lái)了咒程?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤讼育,失蹤者是張志新(化名)和其女友劉穎帐姻,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體奶段,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饥瓷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了痹籍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扛伍。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖词裤,靈堂內(nèi)的尸體忽然破棺而出刺洒,到底是詐尸還是另有隱情,我是刑警寧澤吼砂,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布逆航,位于F島的核電站,受9級(jí)特大地震影響渔肩,放射性物質(zhì)發(fā)生泄漏因俐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一周偎、第九天 我趴在偏房一處隱蔽的房頂上張望抹剩。 院中可真熱鬧,春花似錦蓉坎、人聲如沸澳眷。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)钳踊。三九已至,卻和暖如春勿侯,著一層夾襖步出監(jiān)牢的瞬間拓瞪,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工助琐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祭埂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓兵钮,卻偏偏與公主長(zhǎng)得像蛆橡,于是被迫代替她去往敵國(guó)和親舌界。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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