2015-04-12 51 views
1

我剛遇到一個我一直無法解決的錯誤。當我的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 
+0

查看崩潰跟蹤上方的Xcode運行日誌。查看是否存在關於在解包可選值時意外發現零的一行。如果你在Swift中遇到了一個奇怪的崩潰,這是首先要查找的東西。 – theMikeSwan

+0

嗨,可悲的是沒有任何意外地發現無錯的任何地方,它通常是我的第一個通話端口,但這次沒有任何東西 – Mason

+0

這個問題似乎消失,如果我在主隊列dispatch_async(dispatch_get_main_queue() ){...}所以也許textureFromNode應該在主隊列上? – Mason

回答

1

如果任何人有這個問題,這是通過簡單地利用dispatch_async(...)解決(儘管不能令人滿意) dispatch_get_main_queue()。自從這樣做以來,問題還沒有出現。

+0

Omg是的,這也解決了我的類似問題。 – sabiland

+0

我很高興聽到它幫助你解決了這個問題。我仍然不確定潛在的原因,但至少可以解決這個問題! – Mason

+0

是的,確實:)。 – sabiland