0

我正在编写单元测试,当我遇到 NSKeyedArchiver/NSKeyedUnarchiver 的奇怪行为时。以下是失败的测试。我做错了吗?

这是一个简单的项目:https ://github.com/genesislive2007/Archiving-Headache

-(void)test {

    NSData* serializedObject = [NSKeyedArchiver archivedDataWithRootObject:[Drug new]];

    id deserializedObject = [NSKeyedUnarchiver unarchiveObjectWithData:serializedObject];

    XCTAssertTrue([deserializedObject isKindOfClass:[Drug class]]);

}

更新

一些日志:

NSLog(@"Class as string: %@", NSStringFromClass([deserializedObject class]));
NSLog(@"Address of the static class: %p", [Drug class]);
NSLog(@"Address of the object class: %p", [deserializedObject class]);

归档头痛 [1638:60b] 作为字符串的类:药物

归档头痛[1638:60b] 静态类地址:0x8bfd1d0

归档头痛[1638:60b] 对象类地址:0x357c

正如您在上面看到的,类描述符的地址是不同的。

4

1 回答 1

0

这与取消归档的机制有关,在这种情况下,它与浅拷贝和深拷贝有关。当您取消归档一个对象并将其分配给相应的返回类型时,您正在创建一个 DEEP COPY 或已归档的对象,一个新对象的信息(例如其层次结构和实例变量)存储在具有给定键的指定文件夹中,因为您使用一个键控存档器,当返回时,基本上会创建一个已存档类的新对象/实例,从而允许您创建一个深层副本并正确地将对象恢复为存档状态,这就是您得到的原因一个新地址。程序 19.10

于 2015-11-15T04:12:45.873 回答