加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – NSCoder – 归档指针?

发布时间:2020-12-16 10:15:33 所属栏目:百科 来源:网络整理
导读:我有一个 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 *)
我有一个 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;
}

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

解决方法

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

encodeValueOfObjCType:@encode(id) at:&m_pFarmer

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

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

有人拥有农夫,对吧?所以Barn需要有一个findMyFarmer方法,它查看所有FarmerOwners并找到它应该使用的原始实例. (也许通过比较一个关于农夫的农民ID?)一旦完成,你可以在谷仓实施 – [NSObject awakeAfterUsingCoder:(NSCoder *)]来触发农民替代程序.

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

更新

NSArchivers和NSKeyedArchivers支持conditional archiving的想法(通过encodeConditionalObject :),其中只有在归档中的某个其他对象已添加对象时才将对象添加到归档中.文档说“通常,条件对象用于编码对象的弱或非保留引用.”.因此,如果您的农民已经存档,那么您需要添加它,但如果您只是在没有任何农民的情况下编码您的谷仓,那么您不会想要.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读