【问题标题】:Are references maintained when archiving and unarchiving using NSKeyedArchiver?使用 NSKeyedArchiver 归档和取消归档时是否保留引用?
【发布时间】:2014-08-11 02:24:19
【问题描述】:

假设我执行以下操作:

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”的属性吗?意思是,这两个阵列的第一个汽车对象是否会漏气?参考链接是否仍然保留?有谁知道为什么会这样(例如,它们是如何保存的/为什么不保存?)

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

【问题讨论】:

  • 我想指出,我自己也尝试过,但两次都得到了不同的结果。不过,我可能做错了什么。
  • [unarchivedList1 objectAtIndex:0] = nil; 行不执行任何操作。你打算用那条线做什么?
  • 为什么不记录两个未归档的数组,看看对象指针是什么。这两个数组不太可能共享相同的两个对象。
  • 谢谢。我确认它们不是同一个对象。即使两个数组共享同一个对象,它们也会将同一个对象写入磁盘两次,位于不同的文件位置。
  • 这个问题很困惑。如前所述,[unarchivedList1 objectAtIndex:0] = nil 无效且毫无意义。除此之外,数组是不可变的。除了之外,将归档完全排除在外,并假设可变数组和对这些数组的合理操作:[car1 removeObjectAtIndex:0] 不会影响car2。那么,为什么你会认为在unarchivedList1 上运行会影响unarchivedList2

标签: ios objective-c nskeyedarchiver


【解决方案1】:

如果归档共享同一对象的两个数组,则将该对象归档两次。然后,当您取消归档这两个数组时,您独立地取消归档这些数组,就好像它们是不同的对象一样。取消归档时不会维护引用,因为每次取消归档都会通过调用 NSCoding 协议中的 initWithCoder: 创建新的对象实例。

【讨论】:

  • 档案的引用被保留。因此,如果您将两个共享元素的数组存档到一个存档中,然后取消存档,您将获得两个共享元素的元素。当然,具体的元素会不同于原来的两个数组。
【解决方案2】:

是的。 NSKeyedArchiver 甚至可以应对引用循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多