我正在从b2fixture获取EXC_BAD_ACCESS访问b2body。这可能是由于我缺乏c ++知识,因为我是一个用c ++混合的ObjC开发(刚开始用box2d):
Myb2dUserData.h
@interface Myb2dUserData : NSObject {
MyContact *climbingHoldContact;
}
@property (nonatomic, assign) MyContact *climbingHoldContact;
Myb2dUserData.mm
b2Fixture *fixA = climbingHoldContact->fixtureA;
b2Body *bodA = fixA->GetBody(); //EXC_BAD_ACCESS
我在一个b2ContactListener中分配了climbHoldContact,它几乎是这段代码的副本: http://www.raywenderlich.com/505/how-to-create-a-simple-breakout-game-with-box2d-and-cocos2d-tutorial-part-22
void MyContactListener::BeginContact(b2Contact* contact) {
MyContact myContact = { contact->GetFixtureA(), contact->GetFixtureB() };
_contacts.push_back(myContact);
b2Fixture *fixtureA = contact->GetFixtureA();
b2Body *bodyA = fixtureA->GetBody();
Myb2dUserData *userDataA = (Myb2dUserData *)bodyA->GetUserData();
bodyHoldUD.climbingHoldContact = &myContact;
答案 0 :(得分:0)
此变量myContact
是BeginContact
的本地变量:
MyContact myContact = { contact->GetFixtureA(), contact->GetFixtureB() };
但是在这里,你要存储一个指向它的指针以供将来参考:
bodyHoldUD.climbingHoldContact = &myContact;
当BeginContact
返回时,myContact
变量不再存在,当您稍后尝试访问其fixtureA
时,您的计算机会显示EXC_BAD_ACCESS
因为已覆盖的内容已被覆盖用别的东西。
这与返回指向局部变量的指针的问题相同。
请注意,您构建的示例将MyContact
存储在向量中,而不是MyContact*
s。
您应该能够通过仅将climbingHoldContact
成员更改为不是指针来修复此问题。