Objective-C会序列化/恢复具有多个引用的对象创建重复对象吗?

时间:2014-02-01 00:25:27

标签: ios objective-c serialization reference save

我正在构建游戏并正在实施保存游戏功能。这是对encodeWithCoder:的一系列调用。我正在尝试重新初始化以下数据结构时遇到问题:

  • X strong引用Y
  • Y strong引用Z
  • Z assign引用X

要序列化,请致电encodeWithCoder:

  • X序列化Y
  • Y序列化Z

如何将Z引用恢复为X? 要求Z序列化/反序列化它对X的引用是否合法,或者这会创建重复的对象还是无限循环?

现在我正在尝试通过使用X的通用ID来解决这个问题,因此Z知道X的通用ID,并且在反序列化期间的某个时刻Z会通过ID将X拉出某个列表并将其分配回来它的X参考。 是否有更好/更简单的方法来恢复对X的引用?

1 个答案:

答案 0 :(得分:2)

只需对对象进行编码,它们在写出时就是不受限制的。来自the docs

  

对象图不一定是简单的树结构。二   对象可以包含彼此的引用,例如,创建一个   周期。如果编码器跟随每个链接并盲目地编码每个对象   它遇到了,这个循环引用会产生一个无限循环   在编码器中。此外,单个对象可以被其他几个引用   对象。编码器必须能够识别和处理多个和   循环引用,以便它不编码多个副本   每个对象,但在解码时仍然会重新生成所有引用。

     

为了解决这个问题,NSCoder引入了root的概念   宾语。根对象是对象图的起点。至   编码对象图,您可以调用NSCoder方法   encodeRootObject:,传入第一个要编码的对象。每个对象   跟踪在此调用的上下文中编码的。如果是编码员   被要求不止一次编码一个对象,编码器编码一个   引用第一个编码而不是再次编码对象。