2013-05-08 33 views
2

我在我的聯繫人偵聽器代碼中收到EXC_BAD_ACCESS錯誤。下面是代碼:與聯繫人偵聽器發生EXC_BAD_ACCESS問題

主要對象類(GameObjects),通過它的所有對象的子類:

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 

GameObjects.mm(現在我只想CCLOG告訴如果它的工作):

#import "GameObjects.h" 

@implementation GameObjects 

-(b2Body*)getObjectBody { 
} 

-(void)objectsTouched:(GameObjects*)otherObject { 
    CCLOG(@"it's working"); 
} 

@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); 
}; 

ContactListenerTest.mm:

#import "ContactListenerTest.h" 

void ContactListenerTest:: BeginContact(b2Contact *contact) 
{ 

    b2Fixture  *fixtureA = contact->GetFixtureA(); 
    b2Fixture  *fixtureB = contact->GetFixtureB(); 
    b2Body   *fixtureABody = fixtureA->GetBody(); 
    b2Body   *fixtureBBody = fixtureB->GetBody(); 

    GameObjects* spriteObject = (GameObjects*)fixtureABody->GetUserData(); 
    GameObjects* spriteObject2 = (GameObjects*)fixtureBBody->GetUserData(); 

    [spriteObject objectsTouched:spriteObject2]; 
    [spriteObject2 objectsTouched:spriteObject]; 

} 

當我被打印在控制檯下面的EXC_BAD_ACCESS錯誤:

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

敵人是GameObjects的一個子類。

回答

1

驗證用戶數據對象實際上是GameObjects類:

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

我剛剛添加了斷言,我得到了一個EXC_BAD_ACCESS錯誤。在控制檯中打印了以下內容:***在虛擬void ContactListenerTest :: BeginContact(b2Contact *)(),/ Users/codefreak/Documents /..../ContactListenerTest.mm:36 (lldb)中聲明失敗' – dcone 2013-05-09 12:51:33

+1

ContactListenerTest.mm是一個C++類,不是Objective-C類,所以應該使用NSCAssert1來代替NSAssert1。 – oopology 2013-05-09 13:03:30

0

當初始化遊戲對象應確保所創建的身體指向您的遊戲物體的的UserData。這樣的事情:

objectBody_->SetUserData(self); 
+0

這是否必須爲所有的身體完成。我只爲三個機構中的一個做過。我必須爲所有的身體做這個嗎?另外,我在創建完身體後立即做出了這個決定。 – dcone 2013-05-09 12:55:53

+0

是的,所有這些。如果您嘗試訪問UserData,但您沒有指定任何值,那麼body-> UserData可能指向任何地方。這可能是您獲取EXC_BAD_ACCESS的原因。 – 2013-05-09 13:24:17