1、概述編碼
使用archiveRootObject:toFile:方法能夠將一個對象直接寫入到一個文件中,但有時候可能想將多個對象寫入到同一個文件中,那麼就要使用NSData來進行歸檔對象。atom
NSData能夠爲一些數據提供臨時存儲空間,以便隨後寫入文件,或者存放從磁盤讀取的文件內容。可使用[NSMutableData data]建立可變數據空間。code
2、歸檔2個Person對象到同一文件中對象
歸檔(編碼):內存
// 新建一塊可變數據區it
NSMutableData *data = [NSMutableData data];table
// 將數據區鏈接到一個NSKeyedArchiver對象coding
NSKeyedArchiver *archiver = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:data] autorelease];方法
// 開始存檔對象,存檔的數據都會存儲到NSMutableData中im
[archiver encodeObject:person1 forKey:@"person1"];
[archiver encodeObject:person2 forKey:@"person2"];
// 存檔完畢(必定要調用這個方法)
[archiver finishEncoding];
// 將存檔的數據寫入文件
[data writeToFile:path atomically:YES];
3、從同一文件中恢復2個Person對象
恢復(解碼):
// 從文件中讀取數據
NSData *data = [NSData dataWithContentsOfFile:path];
// 根據數據,解析成一個NSKeyedUnarchiver對象
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
Person *person1 = [unarchiver decodeObjectForKey:@"person1"];
Person *person2 = [unarchiver decodeObjectForKey:@"person2"];
// 恢復完畢
[unarchiver finishDecoding];
4、利用歸檔實現深複製
好比對一個Person對象進行深複製:
// 臨時存儲person1的數據
NSData *data =
[NSKeyedArchiver archivedDataWithRootObject:person1];
// 解析data,生成一個新的Person對象
Student *person2 =
[NSKeyedUnarchiver unarchiveObjectWithData:data];
// 分別打印內存地址
NSLog(@"person1:0x%x", person1); // person1:0x7177a60
NSLog(@"person2:0x%x", person2); // person2:0x7177cf0