我正在使用 SpriteKit 编写应用程序,并且在特定对象(一个 GKComponent 对象)上遇到了 NSCoding 的问题。我正在使用 Swift 4.0 和 iOS 11 进行构建设置。应用程序总是在我试图解码该对象的那一行(标记为 //***)上崩溃。我已经使用相同的结构来编码 / 解码其他对象,它们似乎都可以正常工作。不确定为什么这个特定的 GKComponent 对象无法正常工作。 我花了几个小时尝试解决此问题,但没有找到原因。 任何帮助都会受到感激。
谢谢!
class ItemEntity: GKEntity {
var name: String!
var embeddedSpell: KnockbackComponent?
// 其他变量
init(itemName: String) {
super.init()
name = itemName
embeddedSpell = KnockbackComponent(anItem: self)
addComponent(embeddedSpell!)
// 其他初始化
}
override func encode(with aCoder: NSCoder) {
aCoder.encode(self.name, forKey: "Item.name")
aCoder.encode(embeddedSpell, forKey: "Item.embeddedSpell")
super.encode(with: aCoder)
}
required convenience init?(coder aDecoder: NSCoder) {
let itemName = aDecoder.decodeObject(forKey: "Item.name") as! String
self.init(itemName: itemName)
embeddedSpell = aDecoder.decodeObject(forKey: "Item.embeddedSpell") as? KnockbackComponent
if embeddedSpell != nil {
addComponent(self.embeddedSpell!)
}
}
// 其他代码
}
其他类
class KnockbackComponent: GKComponent {
weak var item: ItemEntity!
init(anItem: ItemEntity) {
item = anItem
super.init()
}
override func encode(with aCoder: NSCoder) {
aCoder.encode(item, forKey: "KnockbackComponent.item")
super.encode(with: aCoder)
}
required convenience init?(coder aDecoder: NSCoder) {
// 这一行导致崩溃,错误消息为 Thread 1: EXC_BAD_INSTRUCTION ***//
let item = aDecoder.decodeObject(forKey: "KnockbackComponent.item") as? ItemEntity //<-- 错误消息 Thread 1: EXC_BAD_INSTRUCTION
self.init(anItem: item!)
}
// 其他代码
}