Cocos2d iphone 联系人侦听器的EXC\u错误\u访问问题

Cocos2d iphone 联系人侦听器的EXC\u错误\u访问问题,cocos2d-iphone,box2d,box2d-iphone,Cocos2d Iphone,Box2d,Box2d Iphone,我的联系人侦听器代码中出现EXC\u BAD\u访问错误。代码如下: 主对象类(游戏对象),通过该类所有对象都是子类: GameObjects.h: #import "cocos2d.h" #import "CCNode.h" #import "CCPhysicsSprite.h" #import "Box2D.h" #include <math.h> @interface GameObjects : CCNode { //b2Body* objectBody_; } -

我的联系人侦听器代码中出现EXC\u BAD\u访问错误。代码如下:

主对象类(游戏对象),通过该类所有对象都是子类:

GameObjects.h:

#import "cocos2d.h"
#import "CCNode.h"
#import "CCPhysicsSprite.h"
#import "Box2D.h"
#include <math.h>

@interface GameObjects : CCNode {
    //b2Body* objectBody_;
}

-(b2Body*)getObjectBody;
-(void)objectsTouched:(GameObjects*)otherObject;
@end
ContactListenerTest.h:

#import <Foundation/Foundation.h>
#import "cocos2d.h"
#import "Box2D.h"
#import "Enemy.h"
#import "Sprite.h"
#import "GameObjects.h"



class ContactListenerTest : public b2ContactListener    {
public:

   b2World* world;
   void BeginContact(b2Contact* contact);
};
当我收到EXC_BAD_访问错误时,控制台中会打印以下内容:

-[Enemy objectsTouched:]: unrecognized selector sent to instance 0x8558840

敌方是GameObjects的子类之一。

验证userdata对象是否属于GameObjects类:

NSAssert1([spriteObject isKindOfClass:[GameObjects class]], 
          @"userdata %@ not a game object", spriteObject);
NSAssert1([spriteObject2 isKindOfClass:[GameObjects class]], 
          @"userdata 2 %@ not a game object", spriteObject2);

当你初始化游戏对象时,你应该确保所创建主体的用户数据指向你的游戏对象。大概是这样的:

objectBody_->SetUserData(self);

我刚刚添加了断言,得到了一个EXC_BAD_访问错误。控制台中打印了以下内容:
***虚拟无效ContactListenerTest::BeginContact(b2Contact*)(),/Users/codefreak/Documents/…/ContactListenerTest.mm:36(lldb)中的断言失败/Cux:CopultListNealTest.MM是C++类而不是ObjuleC类,因此NSCAsjt1应该被用来代替NSRESTT1。这是否需要对所有的主体进行。我只是为三具尸体中的一具做的。我必须为所有的尸体做这个吗?而且,我在创建身体后立即做了。是的,所有的。如果您试图访问UserData,但没有在那里分配任何值,那么body->UserData可能指向任何地方。这可能就是你无法进入EXC的原因。
NSAssert1([spriteObject isKindOfClass:[GameObjects class]], 
          @"userdata %@ not a game object", spriteObject);
NSAssert1([spriteObject2 isKindOfClass:[GameObjects class]], 
          @"userdata 2 %@ not a game object", spriteObject2);
objectBody_->SetUserData(self);