我正在使用 box2d 并且有一些我正在从世界时间步长中销毁的主体(已将它们标记为将它们标记为要删除),但由于获取引用这些主体的联系人,联系人侦听器仍然崩溃。
这是在联系侦听器的 presolve 和 begin 联系方法中所做的:
const b2Body* bodyA = contact->GetFixtureA()->GetBody();
const b2Body* bodyB = contact->GetFixtureB()->GetBody();
Object * objectA = (Object*)bodyA->GetUserData();
Object * objectB = (Object*)bodyB->GetUserData();
objectA 或 objectB 实际上是指向无意义的指针,因为对象已被删除(在世界时间步长之外)。似乎正在创建不良联系人或不应再存在的联系人仍然存在。
更新
我已将代码更改为世界步骤,以确保并验证正确的主体(以及它们的容器主体)被销毁,并发现联系人侦听器仍在尝试处理不应该存在的联系人。我碰巧在 iOS/Xcode 上并启用了 NSZombie 并且确实发现联系人正文用户数据是已释放的对象(发送到已释放实例的消息)。检查 Box2d 源我发现当身体被破坏时接触确实被破坏了。我将不得不通过更多的 Box2D 代码,或者只是更改我的代码以以某种方式解决听众收到的这些神秘联系。
当我测试将主体的用户数据设置为空(同样,在世界步骤之外)时,我在此主体的联系人侦听器中收到的联系人(当我在联系人侦听器中检查时)没有空用户数据。