我使用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版本以及其他一些东西。 我现在无法解决这个问题 我应该用什么方法来调试这次崩溃? 我该怎么做才能研究和解决它?
答案 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];