我正在构建游戏并正在实施保存游戏功能。这是对encodeWithCoder:
的一系列调用。我正在尝试重新初始化以下数据结构时遇到问题:
strong
引用Y strong
引用Z assign
引用X 要序列化,请致电encodeWithCoder:
如何将Z引用恢复为X? 要求Z序列化/反序列化它对X的引用是否合法,或者这会创建重复的对象还是无限循环?
现在我正在尝试通过使用X的通用ID来解决这个问题,因此Z知道X的通用ID,并且在反序列化期间的某个时刻Z会通过ID将X拉出某个列表并将其分配回来它的X参考。 是否有更好/更简单的方法来恢复对X的引用?
答案 0 :(得分:2)
只需对对象进行编码,它们在写出时就是不受限制的。来自the docs:
对象图不一定是简单的树结构。二 对象可以包含彼此的引用,例如,创建一个 周期。如果编码器跟随每个链接并盲目地编码每个对象 它遇到了,这个循环引用会产生一个无限循环 在编码器中。此外,单个对象可以被其他几个引用 对象。编码器必须能够识别和处理多个和 循环引用,以便它不编码多个副本 每个对象,但在解码时仍然会重新生成所有引用。
为了解决这个问题,NSCoder引入了root的概念 宾语。根对象是对象图的起点。至 编码对象图,您可以调用NSCoder方法 encodeRootObject:,传入第一个要编码的对象。每个对象 跟踪在此调用的上下文中编码的。如果是编码员 被要求不止一次编码一个对象,编码器编码一个 引用第一个编码而不是再次编码对象。