1

我正在尝试快速编码和解码一组自定义对象。这些对象看起来像这样:

class MyObject : NSCoding {
  var name: String
  var otherObjects: [MyObject]

  init?(name: String) {
    self.name = name
    self.otherObjects = []
  }

  func encode(with aCoder: NSCoder) {
    aCoder.encode(name, forKey: "name")
    aCoder.encode(otherObjects, forKey: "others")
  }

  required convenience public init?(coder aDecoder: NSCoder) {
    let name = aDecoder.decodeObject(forKey: "name") as! String
    let others = aDecoder.decodeObject(forKey: "others") as! [MyObject]

    self.init(name: name)
    self.otherObjects = others
  }
}

如果 MyObject A 在其数组中包含 MyObject B,则 B 在其数组中也将包含 A。问题是,如上所述,这在启动过程中失败,无法执行此递归解码。使用调试器单步执行,看起来像

  1. 该应用程序尝试解码 A
  2. 在解码A时,它必须解码A的others数组,其中包含B
  3. 应用程序现在必须解码 B。这样做时,它会看到 A 在 B 的others数组中。
  4. 应用程序开始解码 A(B 的编码表示指向的 A),并在尝试这样做时失败。

使用这种方法,我似乎没有保留原始状态(即解码后,A 和 B 不是指向彼此,而是指向彼此的副本)。使用 NSCoder 对像我这样的数据结构进行编码和解码的推荐方法是什么?

4

0 回答 0