Xcode 12.5 中的 SpriteKit/GameplayKit NSCoding 问题

时间:2021-08-12 04:05:09

标签: sprite-kit swift4 nscoding gameplay-kit

我正在使用 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!)
    }

    // 其他代码

}

0 个答案:

没有答案