应用程序在iPhone上崩溃但不在iPad上崩溃

时间:2014-01-20 19:32:56

标签: ios iphone objective-c sprite-kit

我之前发布过,但我关注的是为什么我的应用程序从Testflight崩溃而是从Xcode崩溃。一般答案涉及调试与发布模式,但在这种情况下这没有意义,因为它在iPad上运行,而不是从iPhone运行。触摸某个精灵应该打开一个菜单,它会让它在iPhone上崩溃,但不会在iPad上崩溃。

所以我有一个游戏(使用Sprite Kit),当某个方法完成运行时,它有时会崩溃。当我在Xcode上运行我的iPhone 5s时,它的运行时间为10%(或更少),但如果我上传到Testflight,它会100%完成。

enter image description here

Xcode没有给我很好的调试信息,它在main.m中显示了一条绿色断点线:

return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

并在左侧面板上显示发生在:

Thread 1:

Queue: com.apple.spritekit.renderQueue 0 SKCRenderer::preprocessSpriteImp(std::__1::vector >&, SKRenderQuadPool&, SKCSprite const*, _GLKMatrix4 const&, float, unsigned int&, bool)const

我在这一行中看到EXC_BAD_ACCESS (code=EXC_I386_GPFLT)

0x1015bc663: movq 16(%rbx), %rcx

我会附上实际上周围的东西的图片

我在调试方面很差,而且我不知道该怎么做。一个值得注意的事情是iPad版本从未发生过这种情况。我很困惑为什么有时会发生这种情况但并非总是如此。


更新:我已经进一步追踪了这一点。以下是导致它的代码:

NSString *animation1File = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"MENU-ready-to-animate-%@_00001",devicePrefix] ofType:@"jpg"];
NSString *animation3File = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"MENU-ready-to-animate-%@_00003",devicePrefix] ofType:@"jpg"];
NSString *animation5File = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"MENU-ready-to-animate-%@_00005",devicePrefix] ofType:@"jpg"];

UIImage *animation1 = [UIImage imageWithContentsOfFile:animation1File];
UIImage *animation3 = [UIImage imageWithContentsOfFile:animation3File];
UIImage *animation5 = [UIImage imageWithContentsOfFile:animation5File];

NSMutableArray *menuAnimations = [NSMutableArray arrayWithObjects:
                                  [SKTexture textureWithImage:animation1],
                                  [SKTexture textureWithImage:animation3],
                                  [SKTexture textureWithImage:animation5],
                                  nil];

[SKTexture preloadTextures:menuAnimations withCompletionHandler:^(void) {

    menuNode = [SKSpriteNode spriteNodeWithImageNamed:[NSString stringWithFormat:@"MENU-ready-to-animate-%@_00000.jpg", devicePrefix]];
    menuNode.position = CGPointMake(self.size.width/2, self.size.height/2);
    menuNode.zPosition = 55;
    menuNode.name = @"menu";
    [self addChild:menuNode];
    openMenu = [SKAction animateWithTextures:menuAnimations timePerFrame:0.05];
    SKAction *showWeapons = [SKAction runBlock:^(void) {
        [self showWeapons];
        menuShowing = YES;
        //[self addChild:menuCheckMark];
        //[self addChild:menuCheckMarkLink];
    }];
    [menuNode runAction:[SKAction sequence:@[openMenu, showWeapons]]];
}];

所以重要的是我用 SKTexture textureWithImage:加载图像,但是如果我将其更改为 SKTexture textureWithImageName:那么问题就会消失

NSMutableArray *menuAnimations = [NSMutableArray arrayWithObjects:
                                   [SKTexture textureWithImageNamed:[NSString stringWithFormat:@"MENU-ready-to-animate-%@_00001.jpg",devicePrefix]],
                                   [SKTexture textureWithImageNamed:[NSString stringWithFormat:@"MENU-ready-to-animate-%@_00003.jpg",devicePrefix]],
                                   [SKTexture textureWithImageNamed:[NSString stringWithFormat:@"MENU-ready-to-animate-%@_00005.jpg",devicePrefix]],

我实际上最初使用 textureWithImageNamed ,但纹理使用的内存从未卸载,Apple工程师告诉我使用 textureWithImage 会导致内存卸载速度更快,它做了,但我想它是造成这种情况的。

任何人都可以复制这个,或者提出解释吗?它完全在我的头上,所以我不知道它是否是一个Sprite Kit错误,或者它是否是我做错了什么,这显然是非常可能的!

0 个答案:

没有答案