首先看下面两段代码:
ScoreBoard::ScoreBoard(Sprite* one, Sprite* two, Sprite* three, Sprite* four, Sprite* five)
{
mOnes = one;
mTwos = two;
mThrees = three;
mFours = four;
mFives = five;
mVecs.pushBack(one);
mVecs.pushBack(two);
mVecs.pushBack(three);
mVecs.pushBack(four);
mVecs.pushBack(five);
}
void ScoreBoard::addScore()
{
mScore++;
auto score = mScore;
int count = 0;
char file[20];
while (score % 10 != 0||score>0)
{
int num = score % 10;
sprintf(file, "ICON/%d.png", num);
log("size is %d", mVecs.size());
//这里调用了mVecs,并且程序终止,内存读取错误。
mVecs.at(count)->setTexture(file);
///
score = score / 10;
count++;
}
}
上面标出了程序终止的地方。
今天郁闷了好久,明明已经将对象放入了mVecs,为什么下次调用ScoreBoard::addScore()的时候mVecs读取东西就会出错,经过调试确认是mVecs里面根本没有东西。
猜想:mVecs里面的东西被系统回收了,想想确实如此,加入的精灵对象并没有进行过retain()操作!,于是修改如下代码:
ScoreBoard::ScoreBoard(Sprite* one, Sprite* two, Sprite* three, Sprite* four, Sprite* five)
{
mOnes = one;
mTwos = two;
mThrees = three;
mFours = four;
mFives = five;
mVecs.pushBack(one);
mVecs.pushBack(two);
mVecs.pushBack(three);
mVecs.pushBack(four);
mVecs.pushBack(five);
//这里添加的代码
for (auto s : mVecs){
s->retain();
}
}
还是报错!并没有什么卵用,删掉加入代码再次调试。mVecs里面什么东西都没。后来由系统自动释放的思路想到了我这个ScoreBoard类并没有进行过retain()操作或者addchild()操作,所以系统自动将我这个类里面的mVecs内容都释放放掉了!原来根本不是vector的错。
- 那Vector里面加入的东西为什么不会自动释放掉?我只是放进去了,并没有进行retain,怎么回事。我们来看看Vector的pushBack函数。
void pushBack(T object)
{
CCASSERT(object != nullptr, "The object should not be nullptr");
_data.push_back( object );
//这里系统自动retain!
object->retain();
}
原来每次pushback系统就将自动将对象retain操作!
再次总结两点:
1.cocos Vector 放入的对象只能是继承了ref的类。
2.Vector放入的对象会自动计数+1操作。