【问题标题】:Error after XCode upgrade, ios 8.1, spritekit and swift, object construction 'NSData(contentsOfFile:options:error:)'XCode 升级后出错,ios 8.1,spritekit 和 swift,对象构造 'NSData(contentsOfFile:options:error:)'
【发布时间】:2014-11-01 20:39:40
【问题描述】:

我有一个可以运行的游戏,我运行、编译并上传到了 iTunes connect。但是在更新 XCode 并尝试使用目标 ios 8.1(不是 8.0)编译我的游戏之后。我得到了这个错误。

extension SKNode {
    class func unarchiveFromFile(file : NSString) -> SKNode? {

        let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks")

// ERROR: 
// 'dataWithContentsOfFile(_:options:error:)' is unavailable: use object construction 'NSData(contentsOfFile:options:error:)'

        var sceneData = NSData.dataWithContentsOfFile(path!, options: .DataReadingMappedIfSafe, error: nil)


        var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData)

        archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")
        let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as GameScene
        archiver.finishDecoding()
        return scene
    }
}

我在这里没有触及 unarchiveFromFile 方法,通过搜索谷歌我找不到任何有同样问题的人。在这里真的迷路了。

编辑: 将代码更新为此(在评论之后)

extension SKNode {
    class func unarchiveFromFile(file : NSString) -> SKNode? {

        let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks")

        var sceneData = NSData.dataWithContentsOfFile(path!, options: .DataReadingMappedIfSafe, error: nil)
        var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData)

        archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")
        let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as GameScene
        archiver.finishDecoding()
        return scene
    }
}

现在它可以编译并运行,但随后会模拟崩溃!

我只知道:

dyld`dyld_fatal_error:
0x1fe1e08c:  trap   
0x1fe1e090:  nop     

【问题讨论】:

  • 其实编译器会告诉你具体使用什么:NSData(contentsOfFile: path!, options: .DataReadingMappedIfSafe, error: nil)
  • 谢谢,已编译。但这只会导致另一个崩溃,这次没有错误消息..

标签: ios iphone swift sprite-kit


【解决方案1】:

你可以试试:

extension SKNode {
    class func unarchiveFromFile(file : NSString) -> SKNode? {

    if let path = NSBundle.mainBundle().pathForResource(file as String, ofType: "sks") {

        var sceneData = NSData()
        do {
            try sceneData = NSData(contentsOfFile: path, options:NSDataReadingOptions.DataReadingMappedIfSafe)

        } catch {
            abort()
        }

        let archiver = NSKeyedUnarchiver(forReadingWithData: sceneData)

        archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")
        let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as! GameScene
        archiver.finishDecoding()
        return scene
    } else {
        return nil
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-23
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多