我正在尝试快速编码和解码一组自定义对象。这些对象看起来像这样:
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。问题是,如上所述,这在启动过程中失败,无法执行此递归解码。使用调试器单步执行,看起来像
- 该应用程序尝试解码 A
- 在解码A时,它必须解码A的
others
数组,其中包含B - 应用程序现在必须解码 B。这样做时,它会看到 A 在 B 的
others
数组中。 - 应用程序开始解码 A(B 的编码表示指向的 A),并在尝试这样做时失败。
使用这种方法,我似乎没有保留原始状态(即解码后,A 和 B 不是指向彼此,而是指向彼此的副本)。使用 NSCoder 对像我这样的数据结构进行编码和解码的推荐方法是什么?