Unarchived对象没有已归档对象的类描述符

时间:2014-08-09 11:16:04

标签: ios objective-c unit-testing nsarchiving

我正在编写单元测试,当我遇到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]);

Archiving Headache [1638:60b] Class as string:Drug

Archiving Headache [1638:60b]静态类的地址:0x8bfd1d0

Archiving Headache [1638:60b]对象类的地址:0x357c

如上所述,类描述符的地址是不同的。

1 个答案:

答案 0 :(得分:0)

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