使用NSKeyedArchiver归档和取消归档时是否保留了引用?

时间:2014-08-11 02:24:19

标签: ios objective-c nskeyedarchiver

假设我执行以下操作:

CarObject *car1 = [CarObject new];
CarObject *car2 = [CarObject new];

NSArray *carObjectsList1 = @[car1, car2];
NSArray *carObjectsList2 = @[car1, car2];

还假设汽车对象实现了NSCoding协议。让我们说我存档和 取消归档:

//Archive
[NSKeyedArchiver archiveRootObject:carObjectsList1 toFile:@"list1.dat"];
[NSKeyedArchiver archiveRootObject:carObjectsList2 toFile:@"list2.dat"];
//Unarchive
NSArray *unarchivedList1 = [NSKeyedUnarchiver unarchiveObjectWithFile:@"list1.dat"];
NSArray *unarchivedList2 = [NSKeyedUnarchiver unarchiveObjectWithFile:@"list2.dat"];

然后假设我这样做:

CarObject *car1 = unarchivedList1 objectAtIndex:0];
car1.isTireFlat = true;

这样做会改变" Car1"在两个阵列?意思是,两个阵列的第一个汽车对象是否会有一个爆胎?参考链接是否仍然保留?有谁知道为什么答案是这样的(例如,它们如何保存/为什么它们不被保留?)

编辑:我已编辑了我的问题以提供更正确的示例。

2 个答案:

答案 0 :(得分:2)

如果归档两个共享同一对象的阵列,则将该对象归档两次。然后,当您取消归档这两个数组时,您可以独立地将这些数组取消归档,就好像它们是不同的对象一样。由于每个unarchive都通过在NSCoding协议中调用initWithCoder来创建新的对象实例,因此在unarchiving时不会保留引用。

答案 1 :(得分:1)

是。 NSKeyedArchiver甚至可以应对参考周期。