Archive将多个对象归档到同一个文件
使用archiveRootObject:toFile:方法能够将一个对象直接写入到一个文件里。但有时候可能想将多个对象写入到同一个文件里,那么就要使用NSData来进行归档对象。
NSData能够为一些数据提供暂时存储空间,以便随后写入文件,或者存放从磁盘读取的文件内容。
能够使用[NSMutableData data]创建可变数据空间。
相关的原理图(截图引用):
//归档(编码) // 新建一块可变数据区 NSMutableData *data = [NSMutableData data]; // 将数据区连接到一个NSKeyedArchiver对象 NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; // 開始存档对象,存档的数据都会存储到NSMutableData中 [archiver encodeObject:person1 forKey:@"person1"]; [archiver encodeObject:person2 forKey:@"person2"]; // 存档完成(一定要调用这种方法) [archiver finishEncoding]; // 将存档的数据写入文件 [data writeToFile:path atomically:YES]; //恢复(解码) // 从文件里读取数据 NSData *data = [NSData dataWithContentsOfFile:path]; // 依据数据。解析成一个NSKeyedUnarchiver对象 NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; Person *person1 = [unarchiver decodeObjectForKey:@"person1"]; Person *person2 = [unarchiver decodeObjectForKey:@"person2"]; // 恢复完成 [unarchiver finishDecoding];这样就实现了多个对象的归档。相同那些对应的person对象也是须要和前面所讲的那样进行归档的设置。
从上面所用的person类来进行深拷贝:
<span style="color:#000000;">- (void)viewDidLoad { [super viewDidLoad]; Person* person1 = [[Person alloc]init]; // 暂时存储person1的数据 NSData *data = [NSKeyedArchiver archivedDataWithRootObject:person1]; // 解析data,生成一个新的Person对象 Student *person2 = [NSKeyedUnarchiver unarchiveObjectWithData:data]; // 分别打印内存地址 NSLog(@"person1:%p", person1); NSLog(@"person2:%p", person2); } 结果显示: 2015-08-19 15:42:46.797 ArchiveKey[2593:194031] person1:0x7fc021c33000 2015-08-19 15:42:46.798 ArchiveKey[2593:194031] person2:0x7fc021c2f140 能够看到两个地址不同样的。 </span>