標籤:
1、概述
使用archiveRootObject:toFile:方法可以將一個對象直接寫入到一個檔案中,但有時候可能想將多個對象寫入到同一個檔案中,那麼就要使用NSData來進行歸檔對象。
NSData可以為一些資料提供臨時儲存空間,以便隨後寫入檔案,或者存放從磁碟讀取的檔案內容。可以使用[NSMutableData data]建立可變資料空間。
2、歸檔2個Person對象到同一檔案中
歸檔(編碼):
// 建立一塊可變資料區
NSMutableData *data = [NSMutableData data];
// 將資料區串連到一個NSKeyedArchiver對象
NSKeyedArchiver *archiver = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:data] autorelease];
// 開始存檔對象,存檔的資料都會儲存到NSMutableData中
[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
iOS開發之資料存放區之NSData