我刚遇到一个我一直无法解决的错误。当我的SpriteKit场景加载时,我得到一个EXC_BAD_ACCESS(代码= 1,地址= 0x30)失败。EXC_BAD_ACCESS来自textureFromNode的SKTexture的错误使用Swift 1.2
在viewWillAppear中(......)我的游戏视图控制器调用loadGame(...)功能:
private func loadGame()
{
let gameSceneFile = getRelevantGameScene()
skView.ignoresSiblingOrder = true
if (skView.scene == nil)
{
scene = GameScene.unarchiveFromFile(gameSceneFile) as! GameScene
scene.scaleMode = .AspectFit
skView.presentScene(scene)
scene.load(....)
}
}
在我的游戏场景,负载功能存储传递给它的变量,然后我打开在后台线程游戏资源:
override func didMoveToView(view: SKView)
{
let backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)
dispatch_async(backgroundQueue)
{
self.loadPauseMenu()
self.loadCompleteMenu()
self.loadBoard(self.boardSize)
self.play()
}
}
我的加载板(...)函数中得到本质上的线条错误:
if let labelTexture = view?.textureFromNode(charNodeRefLabel!)
{
let convertedLabel = SKSpriteNode(texture: labelTexture)
convertedLabel.name = "labelTexture"
convertedLabel.zPosition = 1
pieceNode.addChild(convertedLabel)
}
视图和charNodeRefLabel被确认为非零。 charNodeRefLabel是一个简单的SKLabelNode。另外,我尝试在scene.load(...)之前和之后放置presentScene(...),但它仍然以同样的方式崩溃。
如果我注释掉dispatch_async(...),那么它不会崩溃,但UI变得缓慢且无响应,因为它的加载非常多。直到我将项目升级到Swift 1.2后,我才遇到过这个错误。
更令人费解的是它并不总是发生,有时代替EXC_BAD_ACCESS上线发生:
class AppDelegate: UIResponder, UIApplicationDelegate
我真的被这个问题困扰,可能有人帮助我,让我知道,如果有一个明显的错误?过去两天我一直在尝试修复它,但没有任何地方。
请让我知道,如果我可以提供任何额外的信息来帮助。
非常感谢,
的AppDelegate碰撞痕迹:
* thread #1: tid = 0xcc0d2, 0x000000018ee965cc IOAccelerator`IOAccelResourceGetDataSize, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x28)
frame #0: 0x000000018ee965cc IOAccelerator`IOAccelResourceGetDataSize
frame #1: 0x000000018e06ef88 libGPUSupportMercury.dylib`gpusSubmitDataBuffers + 244
frame #2: 0x0000000188e111f4 GLEngine`gliPresentViewES_Exec + 196
frame #3: 0x0000000188e110f8 GLEngine`gliPresentViewES + 84
frame #4: 0x0000000188e1fc58 OpenGLES`-[EAGLContext presentRenderbuffer:] + 72
frame #5: 0x00000001004b5200 libglInterpose.dylib`EAGLContext_presentRenderbuffer(EAGLContext*, objc_selector*, unsigned long) + 372
frame #6: 0x0000000189967620 SpriteKit`-[SKView renderContent] + 228
frame #7: 0x00000001899644f8 SpriteKit`__29-[SKView setUpRenderCallback]_block_invoke + 64
frame #8: 0x00000001899906e8 SpriteKit`-[SKDisplayLink _callbackForNextFrame:] + 272
frame #9: 0x00000001004b47fc libglInterpose.dylib`-[DYDisplayLinkInterposer forwardDisplayLinkCallback:] + 168
frame #10: 0x000000018948a29c QuartzCore`CA::Display::DisplayLinkItem::dispatch() + 32
frame #11: 0x000000018948a134 QuartzCore`CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 324
frame #12: 0x0000000186265470 IOKit`IODispatchCalloutFromCFMessage + 376
frame #13: 0x0000000185056dc4 CoreFoundation`__CFMachPortPerform + 180
frame #14: 0x000000018506ba54 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 56
frame #15: 0x000000018506b9b4 CoreFoundation`__CFRunLoopDoSource1 + 436
frame #16: 0x0000000185069934 CoreFoundation`__CFRunLoopRun + 1640
frame #17: 0x0000000184f952d4 CoreFoundation`CFRunLoopRunSpecific + 396
frame #18: 0x000000018e7b36fc GraphicsServices`GSEventRunModal + 168
frame #19: 0x0000000189b5afac UIKit`UIApplicationMain + 1488
* frame #20: 0x0000000100102c04 WS`main + 164 at AppDelegate.swift:12
frame #21: 0x0000000196f06a08 libdyld.dylib`start + 4
查看崩溃跟踪上方的Xcode运行日志。查看是否存在关于在解包可选值时意外发现零的一行。如果你在Swift中遇到了一个奇怪的崩溃,这是首先要查找的东西。 – theMikeSwan
嗨,可悲的是没有任何意外地发现无错的任何地方,它通常是我的第一个通话端口,但这次没有任何东西 – Mason
这个问题似乎消失,如果我在主队列dispatch_async(dispatch_get_main_queue() ){...}所以也许textureFromNode应该在主队列上? – Mason