8行spritekit代码上的EXC_BAD_ACCESS

时间:2015-09-07 10:36:32

标签: objective-c sprite-kit exc-bad-access autorelease

我极短的应用代码会以某种方式产生EXC_BAD_ACCESS错误。我在一个全新的应用程序上重现了错误。但我无法理解这是怎么发生的。

以下是我的应用程序的完整代码(除了xcode为spritekit游戏自动生成的内容)。

-(void)didMoveToView:(SKView *)view {
    SKNode* pFirst = [SKNode node];
    [self addChild:pFirst];
    //
    SKSpriteNode* pSprite = [SKSpriteNode spriteNodeWithImageNamed:@"img61.png"];
    pSprite.centerRect = CGRectMake(0.4,0.4, 0.2, 0.2); // suspect 1
    pSprite.position = CGPointMake(0,0);
    pSprite.xScale = 2.0;
    pFirst.alpha = 0.0;             //  suspect 2
    //
    [pFirst addChild:pSprite];    
}

调试器将崩溃点放在此处:

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

我怎么能理解这里有什么问题?

当然,这个问题最初来自一个崩溃的应用程序。这是我在简化时留下的代码,但保留了崩溃。

两行标记为“嫌疑人”。令人惊讶的是,如果删除了MITHER suspect1或suspect2,代码运行正常。我根本无法理解这一点。

1 个答案:

答案 0 :(得分:1)

我们可能会从ArrayList

的描述中找到一些提示
  

定义纹理如何应用于精灵的属性。

因此,如果您设置精灵的centerRect并设置其centerRect,则混合到帧缓冲区中的alpha将为0(有关详细信息,请参阅Creating a Textured Sprite)。从我们刚刚测试的当前案例中,零alpha精灵被视为空精灵。因此,将子节点添加到空精灵会导致崩溃。

要解决此问题,一种方法是将alpha = 0.0更改为pFirst.alpha = 0.0;。另一种方法是在渲染到场景的精灵之后设置alpha。在 didMoveToView 方法中,为pFirst.hidden = YES;分配标识符,

pFirst

然后,添加以下方法,在执行物理模拟后将alpha设置为零,

pFirst.name = @"firstNode"