XCode升级,ios 8.1,spritekit和swift,对象构建'NSData(contentsOfFile:options:error :)'后出错'

问题描述:

我有一个工作的游戏,我运行,编译并上传到iTunes连接。但在更新XCode并试图用目标ios 8.1(不是8.0)编译我的游戏之后。我有这个错误。XCode升级,ios 8.1,spritekit和swift,对象构建'NSData(contentsOfFile:options:error :)'后出错'

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  
+2

其实编译器会告诉你用什么:'NSData的(contentsOfFile:路径!选择:.DataReadingMappedIfSafe,错误:无)' – 2014-11-01 20:44:41

+0

谢谢,补充说它编译。但这只是导致另一次崩溃,这次没有错误信息.. – ganjan 2014-11-02 13:05:59

+0

可能相关:https://stackoverflow.com/questions/26836102/crash-on-instantiating-sklabelnode-swift-ios-8-1 – 2014-11-10 04:27:05

你可以试试:

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 
    } 
}