我极短的应用代码会以某种方式产生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,代码运行正常。我根本无法理解这一点。
答案 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"