對象歸檔

8.8.1 使用NSKeyedArchiver歸檔

與NSKeyedArchiver配套使用的還有一個NSKeyedUnarchiver類,其中心铃,NSKeyedArchiver負責將對象歸檔到核定文件中儡湾,而NSKeyedUnarciver則負責從文件中恢復這些對象

運行機制:

NSKA會創(chuàng)建一種所謂的帶鍵(keyed)的檔案赞厕,在這種歸檔格式中,無論歸檔那個對象屎飘,程序都需要誒該對象分配一個Key导帝。

1.直接調用NSKA 的archivedDataWithRootObject:data,archiveRootObject:的unarchiveObjectWithData:data或unarchiveObjectWithFile:file類方法 ?簡單便捷 功能簡單

2.NSmutableData對象為參數(shù)堡称,創(chuàng)建NSKA對象,重復調用NSKeyedArchiver的 encodeXxx:value forKey:key方法一次歸檔不同的對象墙贱,最后調用finishEncodeing 方法結束歸檔热芹。 較為復雜

8.8.2實現(xiàn)NSCoding協(xié)議

自定義的類歸檔時,需要實現(xiàn)NSCoding協(xié)議

initWithCoder: 負責恢復該對象

encodeWithCoder:歸檔該對象

如果該對象實例變量為OC類型惨撇,并且實現(xiàn)了NSCoding協(xié)議伊脓,則可直接調用encidingObject:forKey:方法來歸檔該實例變量,使用decodeObjectForKey:進行恢復串纺。如果該對象的實例變量時OC型丽旅,但沒有實現(xiàn)協(xié)議椰棘,則會比較麻煩纺棺。

C類型:

例:

歸檔數(shù)據(jù)????????????????????恢復數(shù)據(jù)

encodeB:forKey: ? ? ?decodeBoolForKey:

encodeInt:forKey:??????decodeIntForKey:

//實現(xiàn)NSCoding

FKApple* apple1=[[FKApple alloc]initWithColor:@"紅色" withWeight:12.3 withSize:32];

[NSKeyedArchiver archiveRootObject:apple1 toFile:@"myApple.archive"];

NSLog(@"%@",apple1.description);

FKApple* apple2=[NSKeyedUnarchiver unarchiveObjectWithFile:@"myApple.archive"];

NSLog(@"%@",apple2.description);

8.8.3 使用NSData完成自定義歸檔

如果對象較多,可通過結束NSMutableData來創(chuàng)建NSKeyedArchiver或NSKeyedUnarchiver

1.以NSMutableData作為參數(shù)邪狞,創(chuàng)建NSKeyedArchiver對象

2.重復調用 NSKeyedArchiver對象的encodeXxx:forKey:方法來歸檔所有需要歸檔到一個文件中的對象

3.調用NSKeyedArchaiver對象額finishEnciding方法結束歸檔

4.程序可以選擇將保存歸檔數(shù)據(jù)的NSData通過萬羅傳輸或輸出到磁盤文件中祷蝌。

//使用data進行歸檔

NSDictionary* dict3=[NSDictionary

dictionaryWithObjectsAndKeys:@89,@"OC",

@69,@"Ruby",@75,@"Python",nil];

NSSet* set=[NSSet setWithObjects:

@"FKiOS",

@"FKAndroid",

@"FKAjax",nil];

FKApple* apple3=[[FKApple alloc]initWithColor:@"紅色" withWeight:12.3 withSize:32];

NSMutableData* data=[NSMutableData data];

NSKeyedArchiver* arch=[[NSKeyedArchiver alloc]

initForWritingWithMutableData:data];

[arch encodeObject:dict3 forKey:@"myDict"];

[arch encodeObject:set forKey:@"set"];

[arch encodeObject:apple3 forKey:@"myApp"];

[arch finishEncoding];

if ([data writeToFile:@"multi.archive"? atomically:YES]==NO) {

NSLog(@"歸檔失敗");

}

//讀取

NSData* data2=[NSData dataWithContentsOfFile:@"multi.archive"];

NSKeyedUnarchiver* unarch=[[NSKeyedUnarchiver alloc]

initForReadingWithData:data2];

NSDictionary* dict2=[unarch decodeObjectForKey:@"myDict"];

NSSet* set1=[unarch decodeObjectForKey:@"set"];

FKApple* myApp=[unarch decodeObjectForKey:@"myApp"];

NSLog(@"恢復\n%@",dict2);

NSLog(@"恢復\n%@",set1);

NSLog(@"恢復\n%@",myApp);

8.8.4 使用歸檔實現(xiàn)深復制

歸檔會將整個對象轉黃偉字節(jié)數(shù)據(jù),包括該對象的所有實例變量帆卓,如果該實例變量指向另一個OC對象巨朦,歸檔時也會歸檔該實例變量所指想的OC對象。這表明:當程序歸檔一個對象時剑令,系統(tǒng)會把該對象冠梁的所有數(shù)據(jù)都轉為字節(jié)數(shù)據(jù)糊啡,如果程序從這些數(shù)據(jù)中國恢復該對象,恢復出來的對象與原對象將完全相同

深復制:復制的對象與原對象完全相同吁津,但是各占獨立的空間

NSDictionary* dict4=[NSDictionary dictionaryWithObjectsAndKeys:

[[FKApple alloc] initWithColor:@"紅色" withWeight:321 withSize:12] ,

@"apple1",[[FKApple alloc] initWithColor:@"黃色" withWeight:31 withSize:12 ? ? ? ],@"apple2",

[[FKApple alloc] initWithColor:@"藍色" withWeight:23 withSize:321],@"apple3",nil];

//將要歸檔的資料寫入到data

NSData* data3=[NSKeyedArchiver archivedDataWithRootObject:dict4];

NSDictionary* dictCopy=[NSKeyedUnarchiver unarchiveObjectWithData:data3];

FKApple* apple5=[dictCopy valueForKey:@"apple1"];

FKApple* apple6=[dict4 valueForKey:@"apple1"];

[apple5 setColor:@"黑色"];

NSLog(@"%@",[apple5 description]);

NSLog(@"%@",[apple6 description]);

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末棚蓄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子碍脏,更是在濱河造成了極大的恐慌梭依,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件典尾,死亡現(xiàn)場離奇詭異役拴,居然都是意外死亡,警方通過查閱死者的電腦和手機钾埂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門河闰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人褥紫,你說我怎么就攤上這事淤击。” “怎么了故源?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵污抬,是天一觀的道長。 經(jīng)常有香客問我,道長印机,這世上最難降的妖魔是什么矢腻? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮射赛,結果婚禮上多柑,老公的妹妹穿的比我還像新娘。我一直安慰自己楣责,他們只是感情好竣灌,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秆麸,像睡著了一般初嘹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沮趣,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天屯烦,我揣著相機與錄音,去河邊找鬼房铭。 笑死驻龟,一個胖子當著我的面吹牛,可吹牛的內容都是我干的缸匪。 我是一名探鬼主播翁狐,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼凌蔬!你這毒婦竟也來了露懒?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤龟梦,失蹤者是張志新(化名)和其女友劉穎隐锭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體计贰,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡钦睡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了躁倒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荞怒。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖秧秉,靈堂內的尸體忽然破棺而出褐桌,到底是詐尸還是另有隱情,我是刑警寧澤象迎,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布荧嵌,位于F島的核電站呛踊,受9級特大地震影響,放射性物質發(fā)生泄漏啦撮。R本人自食惡果不足惜谭网,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赃春。 院中可真熱鬧愉择,春花似錦、人聲如沸织中。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狭吼。三九已至层坠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搏嗡,已是汗流浹背窿春。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工拉一, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留采盒,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓蔚润,卻偏偏與公主長得像磅氨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子嫡纠,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內容