cocos2d中的box2d与EXC_BAD_ACCESS崩溃。怎么调试?

时间:2012-11-30 07:36:21

标签: ios debugging cocos2d-iphone box2d exc-bad-access

我使用Cocos2d v 1.0.1和Box2d(cocos2d + box2d模板)创建iOS应用程序。 在iPad上我的应用运行正常 在iPhone 4,4s(ios版本5.0.1,6.0,未经过其他iPhone /固件测试)上,我在游戏开始时(短时间播放后)获得了EXC_BAD_ACCESS。

myActor.position = CGPointMake( b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO  );

我分析了b和Box2d世界的状态,看起来世界的尸体列表已经被破坏了。 指向b的指针包含b2PolygonShape,而不是b2Body(我在Xcode的Variables View中看到)。 有时候(也只在iPhone上),我的游戏开始表现得出乎意料。 我在我的更新方法中设置了断点,并意识到Box2d世界的正文列表仅包含一个正文(但在之前的更新世界中包含许多正文,并且在视觉上它们在当前更新的屏幕上)。

我检查了我的游戏代码,但找不到错误或这种行为的原因。 我尝试使用Xcode的Analyze功能,更改Box2d版本以及其他一些东西。 我现在无法解决这个问题 我应该用什么方法来调试这次崩溃? 我该怎么做才能研究和解决它?

1 个答案:

答案 0 :(得分:1)

我通过从我的应用中排除部分与Box2d相关的代码来发现错误。 在以下代码中

    CCDelayTime *destroyDelay = [CCDelayTime actionWithDuration:0.001];
    CCCallBlock *destroyBlock = [CCCallBlock actionWithBlock:^{
        b2Body * b = (b2Body *)[bodyVal pointerValue];
        b->SetUserData(NULL);
        [self world]->DestroyBody(b);
    }];
    [self runAction: [CCSequence actions:destroyDelay,destroyBlock, nil]];
存储在NSValue中的

指针b在执行CCCallblock时可能无效,这会导致内存错误。

我用

替换了这段代码
NSValue *bodyVal = [NSValue valueWithPointer: body ];
[self.bodiesThatHeroCollidedWith addObject: bodyVal ];

然后在我的更新中:方法我清理self.bodiesThatHeroCollidedWith数组:

for (NSValue *body in self.bodiesThatHeroCollidedWith) {
    b2Body *b = (b2Body *)[body pointerValue];
    b->SetUserData( NULL );
    world->DestroyBody( b );
}
[self.bodiesThatHeroCollidedWith removeAllObjects];