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