NSCoder - 归档指针?

3 objective-c

我有一个objective-c类,它包含指向另一个类的指针.我想通过NSCoder归档这个类的实例:

@interface Barn
{
    int m_numHorses;

    // Barn does not allocate this instance, it just points to it.
    Farmer* m_pFarmer;
}
@end

...

- (void)encodeWithCoder:(NSCoder *)encoder
{
    [encoder encodeInt:m_numHorses forKey:@"numHorses"];
    [encoder encode?:m_pFarmer forKey:@"pFarmer"];
}

- (void) setPointer:(Farmer*)pFarmer
{
    m_pFarmer = pFarmer;
}
Run Code Online (Sandbox Code Playgroud)

我如何归档m_pFarmer指针?它对我来说没有意义,因为它只是一个地址,我不知道NSCoder可以为你串行化到磁盘,以便它知道如何在反序列化时恢复链接?

BJ *_*mer 7

您不能直接编码指针,因为当您取消归档对象时,指针的值将完全不同.我的意思是,你可以存储它

encodeValueOfObjCType:@encode(id) at:&m_pFarmer 
Run Code Online (Sandbox Code Playgroud)

但是不能保证反序列化的指针指向反序列化的农民; 事实上,它很可能不会.

如果Barn不拥有Farmer,则Barn不应在反序列化时重新创建; 你最终会得到一个Farmer与原来没有分开的新东西.那么,您需要的是找到原始Farmer的反序列化实例的方法,并将Barn的Farmer实例替换为另一个.

有人拥有Farmer,对吧?因此Barn需要有一个findMyFarmer方法,它查看所有FarmerOwners并找到它应该使用的原始实例.(也许通过比较farmerID在伊娃Farmer?)一旦这样做了,就可以实现-[NSObject awakeAfterUsingCoder:(NSCoder *)]Barn引发农民更换程序.

希望有道理.查看有关存档和序列化的文档,尤其是有关编码和解码对象的页面,以了解有关动态替换对象的更多信息.

更新

NSArchivers和NSKeyedArchivers支持条件存档的概念,(via encodeConditionalObject:)只有在存档中的某个其他对象已添加对象时才将对象添加到存档中.文档说" 通常,条件对象用于编码对象的弱或非保留引用. ".因此,如果您Farmer已经存档,那么您需要添加它,但如果您只是在Barn没有任何农民的情况下对您进行编码,那么您就不会想要.

绝对查看上面引用的文档.