我有一个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可以为你串行化到磁盘,以便它知道如何在反序列化时恢复链接?
您不能直接编码指针,因为当您取消归档对象时,指针的值将完全不同.我的意思是,你可以存储它
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没有任何农民的情况下对您进行编码,那么您就不会想要.
绝对查看上面引用的文档.
| 归档时间: |
|
| 查看次数: |
1186 次 |
| 最近记录: |