Interpretar una traza inversa cuando se cuelga en el dispositivo, pero no el simulador

Mi aplicación se bloquea cuando la ejecuto en mi iPhone 4, pero no funciona cuando la ejecuto en el simulador. Me imagino que es algo sobre que estoy usando más memory de lo permitido.

No tengo idea del post de error. El error es simplemente (lldb) y cuando (lldb) bt , obtengo el código siguiente …

Le estaría muy agradecido si alguien me arrojara alguna luz sobre cómo comenzar a entender este post de error, porque para mí es como chino (y, por supuesto, no soy chino)

 (lldb) bt * thread #1: tid = 0x7396a, 0x37db5ce2 libsystem_platform.dylib`OSSpinLockLock$VARIANT$up + 2, queue = 'com.apple.spritekit.textureOp, stop reason = EXC_BAD_ACCESS (code=1, address=0x0) frame #0: 0x37db5ce2 libsystem_platform.dylib`OSSpinLockLock$VARIANT$up + 2 frame #1: 0x2fa9da68 SpriteKit`SKSpinLockSync(int*, void () block_pointer) + 92 frame #2: 0x2fa63a48 SpriteKit`-[SKTexture loadImageData] + 300 frame #3: 0x2fa6735a SpriteKit`-[SKTexture load] + 126 frame #4: 0x37c79d06 libdispatch.dylib`_dispatch_client_callout + 22 frame #5: 0x37c8be72 libdispatch.dylib`_dispatch_barrier_sync_f_invoke + 26 frame #6: 0x2fa672ae SpriteKit`-[SKTexture _loadOnTextureQueue] + 122 frame #7: 0x2fa98cf0 SpriteKit`SKCSprite::prepareForRendering() const + 1168 frame #8: 0x2faaaf0c SpriteKit`SKCRenderer::preprocessSpriteImp(std::__1::vector<SKCRenderer::SpriteRenderInfo, std::__1::allocator<SKCRenderer::SpriteRenderInfo> >&, SKRenderQuadPool&, SKCSprite const*, _GLKMatrix4 const&, float, unsigned int&, bool) const + 124 frame #9: 0x2faab9a4 SpriteKit`SKCRenderer::preprocessSpriteImp(std::__1::vector<SKCRenderer::SpriteRenderInfo, std::__1::allocator<SKCRenderer::SpriteRenderInfo> >&, SKRenderQuadPool&, SKCSprite const*, _GLKMatrix4 const&, float, unsigned int&, bool) const + 2836 frame #10: 0x2faa73b4 SpriteKit`SKCRenderer::preprocessAndSubmitSpriteInternal(std::__1::vector<SKCRenderer::SpriteRenderInfo const*, std::__1::allocator<SKCRenderer::SpriteRenderInfo const*> >&, std::__1::vector<SKCRenderer::SpriteRenderInfo, std::__1::allocator<SKCRenderer::SpriteRenderInfo> >&, SKRenderQuadPool&, SKCSprite const*, _GLKMatrix4 const&) + 52 frame #11: 0x2faa5e7c SpriteKit`SKCRenderer::preprocessAndSubmitSprite(SKCSprite const*, _GLKMatrix4 const&) + 152 frame #12: 0x2faa973e SpriteKit`SKCRenderer::submitScene(SKScene*) + 186 frame #13: 0x2faabf5c SpriteKit`SKCRenderer::renderScene(SKScene*) + 148 frame #14: 0x2fa71120 SpriteKit`-[SKView _renderContent] + 1072 frame #15: 0x37c79d06 libdispatch.dylib`_dispatch_client_callout + 22 frame #16: 0x37c8be72 libdispatch.dylib`_dispatch_barrier_sync_f_invoke + 26 frame #17: 0x2fa70cc2 SpriteKit`-[SKView renderContent] + 82 frame #18: 0x2fa6e662 SpriteKit`__29-[SKView setUpRenderCallback]_block_invoke + 130 frame #19: 0x2fa90dda SpriteKit`-[SKDisplayLink _callbackForNextFrame:] + 254 frame #20: 0x00216a66 libglInterpose.dylib`-[DYDisplayLinkInterposer forwardDisplayLinkCallback:] + 270 frame #21: 0x2f8509ce QuartzCore`CA::Display::DisplayLinkItem::dispatch() + 98 frame #22: 0x2f850778 QuartzCore`CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 344 frame #23: 0x3243576c IOMobileFramebuffer`IOMobileFramebufferVsyncNotifyFunc + 104 frame #24: 0x2e0e8a74 IOKit`IODispatchCalloutFromCFMessage + 248 frame #25: 0x2d3c6e20 CoreFoundation`__CFMachPortPerform + 136 frame #26: 0x2d3d19de CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 34 frame #27: 0x2d3d197a CoreFoundation`__CFRunLoopDoSource1 + 346 frame #28: 0x2d3d014e CoreFoundation`__CFRunLoopRun + 1398 frame #29: 0x2d33ac26 CoreFoundation`CFRunLoopRunSpecific + 522 frame #30: 0x2d33aa0a CoreFoundation`CFRunLoopRunInMode + 106 frame #31: 0x32019282 GraphicsServices`GSEventRunModal + 138 frame #32: 0x2fbde048 UIKit`UIApplicationMain + 1136 frame #33: 0x00067b5c superBeeLand`main(argc=1, argv=0x27dbbc64) + 116 at main.m:16 (lldb) 

Parece que [SKAction setTexture:] está dañado. Estaba recibiendo el mismo error com.apple.spritekit.textureOp bad_access en el hilo principal. Mi aplicación estaba fallando en hardware antiguo (pre iPad mini) y en todos los simuladores.

Establezca la textura de spriteNode en lugar de utilizar SKAction en él.

 spriteNode.texture = [SKTexture textureWithImageNamed:@"imageName"]; 

Finalmente encontré una respuesta a esto. Bueno, la primera pista es que el error es EXC_BAD_ACCESS. Eso casi siempre significa que bash acceder a la memory donde no hay un object. Tal vez un puntero corrompido, o un object desaparecido (se ha desasignado o perdido la reference a él).

Yendo más lejos en la huella, parece estar relacionado con la carga de textura de alguna manera. Así que empecé mirando cualquier lugar donde intentaba cargar / precargar texturas, crear sprites, etc. Pero parece que puede estar dentro del bucle de prerender / render, lo que puede significar que no estoy cargando texturas explícitamente, sino que Sprite Kit tratando de cargar texturas dinámicamente cuando sea necesario.

He intentado eliminar algunos de los sprites hasta que no se cuelga, para networkingucir cuál te está dando el problema y finalmente encontré que era mi movimiento de héroe. Para su animation, uso una @propertie int _imgNum ; Y agréguelo a un [NSString stringWithFormat:@"image%d",_imgNum]; por lo que el _imgNum es el número de la image. Inicializo _imgNum al comienzo de la escena e incrementarlo cada vez que lo uso (en didSimulatePhysics() y en touchedMovedWithEvent() ). A veces, la aplicación no encuentra la image y es cuando falla, pero todavía no entiendo por qué no puedo cargar imágenes. Será mejor que muestre el código.

  if(_imgNum >= 1 && _imgNum <= 12 ) { [[self childNodeWithName:@"hero"]runAction:[SKAction setTexture:[SKTexture textureWithImageNamed:[NSString stringWithFormat:@"heroRunnning%d",_imgNum]]]]; _imgNum++; if(_imgNum >= 12) { _imgNum = 1; } } 

Tuve el problema porque estaba usando esto:

 SKAction* changeTextTo_Los = [SKAction runBlock:^{ [myNode removeFromParent]; }]; 

Esto causó un locking ya que quería acceder al object después de ejecutar el bloque o por algún motivo. Por supuesto, esto no fue posible porque ya se eliminó.