不知道该怎么描述了,贴出代码请帮忙看看。

Player.h文件:

class Player:public CCNode{
public:
    Player();
    ~Player();
   
    CREATE_FUNC(Player);
    virtual bool init();
    void setOthersRole(int rolenum);
    
    void initOthers(float x, float y,int userseat, int playerseat,std::string playername, std::string gender);
    
private:
    
  CCSprite* role;
    
 CCSprite* bar;

};



```


Player.cpp
#include "Player.h"
#include "Constants.h"
#define UNI_PLAYER_HEIGHT 80
Player::Player(){
    
}

Player::~Player(){
    
}

bool Player::init(){
    bool bRet = false;
    do {
        bRet = true;
    } while (0);
    return bRet;
}


void Player::initOthers(float x, float y, int userseat, int playerseat, std::string playername, std::string gender){
    
    bar = CCSprite::createWithSpriteFrameName("bar.png");
    bar->retain();
 
    bar->setPosition(ccp(x, y-UNI_PLAYER_HEIGHT));
  
    role=CCSprite::create();
    role->setPosition(ccp(bar->getPositionX()+40, bar->getPositionY()));
    
    addChild(role);
    
    addChild(bar);
}

void Player::setOthersRole(int rolenum){
    switch(rolenum){
        case 1:
            
            role->setDisplayFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("police.png"));
            break;
        case 2:
            
            role->setDisplayFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("killer.png"));
            
            break;
        default:
            role->setDisplayFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("people.png"));
            
            break;
    }
}



```


然后在GameScene.cpp文件里,先初始化一组Player:
others = CCArray::create();
    
    CC_SAFE_RETAIN(others);
    
    
    for(int i=0;i<14;i++){
        Player* p = Player::create();
        addChild(p);
        others->addObject(p);
    }


```


然后在update里根据socket传来的json设置每个player(省略了json的处理):
void GameScene::waitforother(){
    std::string s = CCUserDefault::sharedUserDefault()->getStringForKey("seatid");
    seatid = s.c_str();
    
        for (int i=0; iobjectAtIndex(atoi(id.c_str())-1);
                    CCSprite* seat=(CCSprite*) seatsarray->objectAtIndex(atoi(id.c_str())-1);
                    
                    p->initOthers(seat->getPositionX()+(seat->getContentSize()).width/2, seat->getPositionY()+(seat->getContentSize()).height/2, atoi(seatid), atoi(id.c_str()), name.c_str()==NULL?"":name.c_str(), sex.c_str()==NULL?"":sex.c_str());
                
            }
    
    
}



```


之后再在update里根据不同的条件,调用player的setOthersRole:
for (int i=0; iobjectAtIndex(atoi(id.c_str())-1);
                
                p->setOthersRole(playerrole);
            
        }


```


但这时就会在Player的setOthersRole方法里报:EXC_BAD_ACCESS错误(见附图)
本来在initOthers方法里已经create过role了,不知道为什么会成了Null。另外player其他成员变量,如bar,如果是放置player的init方法里create的话,在后面的initOthers里也会是null,报exc_bad_access的问题。感觉好像从others这个ccarray里取出的Player对象,成员变量在其他方法里调用总会成为null。请帮忙看看,本人没有c++基础,不知道是不是哪里的成员变量管理不合适。

之前也断断续续的描述过一些该问题:
http://www.cocoachina.com/bbs/read.php?tid=196167
不知道是不是同一个原因。

role没有retain,
一般设置类CCxxx变量的时候都用CC_SYNTHESIZE_RETAIN, 比如CC_SYNTHESIZE_RETAIN(CCSprite *, role, Role);
然后就可以this->setRole(CCSprite::create()); 最后在~Player()里CC_SAFE_RELEASE(role)

这样试了也不行。后来测试了一些,好像还是others = CCArray::create();

CC_SAFE_RETAIN(others);
 
 
for(int i=0;i<14;i++){
    Player* p = Player::create();
    addChild(p);
    others->addObject(p);
}

这里的问题。
我试着在GameScene.h文件定义了一个Player* p2;
然后
p2=Player::create();
others->addObject(p2);
这样后面取出的Player* p = (Player*) others->objcetAtIndex(0);
之后就没有这样的问题了。

但是不明白为什么。另外如果这样做的话,我岂不是要在h文件里从p1到p14都定义一遍?

以前遇见过类似的问题,用的是CCArray 存放的是指针,不retain,后面调用数组元素的时候就空指针或野指针。

可是我之前,ccarray retain,ccarray里添加的对象也retain,还是会有这样的问题,就感觉像你说的,不知道指针指到哪去了,好像取出来的不是原来放进去的

你p2用的是others->objcetAtIndex(0); 不是objectAtIndex(atoi(id.c_str())-1);
会不会是index不对?

先看看是不是每一个player都调用了initOhter函数吧,JSON传递过来数据一定正确吗?
因为你调用了addchild函数的,只要你没有将他们移除掉,那么即使你不retain也不会被删除的,我怀疑并不是每一个player都调用了initOther函数。

哥们牛逼,确实是因为漏掉了一个