2014-02-11 45 views
3

當我在iPhone 4上運行應用程序時,我的應用程序崩潰,但在模擬器上運行時沒有崩潰。我想這是關於我使用的內存超出允許範圍的問題。在設備上發生崩潰時解釋回溯但不是模擬器

我對這個錯誤信息一無所知。錯誤只是(lldb),當我點擊bt,我得到下面的代碼...

我會非常感謝,如果有人扔我一些如何開始理解這個錯誤消息,因爲對我來說就像中文(當然我不是中國人)

(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) 

回答

0

看來[SKAction setTexture:]有一個bug。我在主線程上得到了與com.apple.spritekit.textureOp bad_access相同的錯誤。我的應用程序崩潰在舊的硬件(iPad mini前)和所有的模擬器。

設置spriteNode的紋理而不是在其上使用SKAction。

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

這導致崩潰,因爲他想在運行塊或某種原因後訪問對象:

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

我終於找到了答案。 那麼,第一個線索是錯誤是EXC_BAD_ACCESS。這幾乎總是意味着我試圖訪問沒有對象的內存。也許是一個損壞的指針或一個對象消失了(被釋放或失去對它的引用)。

沿着軌跡走得更遠,它似乎與某種方式的紋理加載有關。因此,我開始通過查看任何我試圖加載/預加載紋理,創建精靈等的地方,但看起來它可能位於prerender/render循環內,這可能意味着它不是我明確加載紋理,而是Sprite Kit試圖在需要時動態加載紋理。

我已經嘗試刪除一些精靈,直到它不崩潰,縮小哪一個給你的問題,我終於發現這是我的英雄運動。對於他的動畫,我使用@propertie int _imgNum ;並將其添加到[NSString stringWithFormat:@"image%d",_imgNum];,因此_imgNum是圖像的編號。 我在場景的開始處初始化_imgNum,並在每次使用時增加它(在didSimulatePhysics()touchedMovedWithEvent()中)。 有時應用程序沒有找到圖像,這是它崩潰的時候,但我仍然不明白爲什麼無法加載圖像。 我會更好地展示代碼。

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

我,因爲我是用這個有問題。這當然不可能,因爲它已經被刪除了。

相關問題