2015-04-12 1 views
1

Я только что столкнулся с ошибкой, которую я не смог решить. Я получаю ошибку EXC_BAD_ACCESS (code = 1, address = 0x30), когда моя сцена SpriteKit загружается.EXC_BAD_ACCESS Ошибка для SKTexture из textureFromNode With Swift 1.2

В viewWillAppear (...) мой Game View Controller вызывает функцию 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() 
    } 
} 

я получаю ошибку во время выполнения функции loadBoard (...) в основном на линиях:

if let labelTexture = view?.textureFromNode(charNodeRefLabel!) 
    { 
      let convertedLabel = SKSpriteNode(texture: labelTexture) 
      convertedLabel.name = "labelTexture" 
      convertedLabel.zPosition = 1 
      pieceNode.addChild(convertedLabel) 
    } 

Просмотр и charNodeRefLabel подтверждены как не-ноль. charNodeRefLabel - это простой SKLabelNode. Кроме того, я попытался разместить вызов presentScene (...) до и после scene.load (...), но он все равно сбой аналогичным образом.

Если я прокомментирую dispatch_async (...), то это не сбой, но пользовательский интерфейс становится медленным и не отвечает, поскольку он загружает довольно много. Я не сталкивался с этой ошибкой, пока не обновил свой проект до 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

Смежные вопросы