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]);