2016-09-27 60 views
1

在我的游戏场景中,我从一个随着MoveBy动作随机移动的球类生成球。我的问题是,在MoveTo动作结束后,我如何释放球?请参阅我下面的代码:行动后释放新对象

//GameScene class 
... 

Ball *ball = new Ball(); //<----need to release this after action is over 
ball->spawnBall(this); 

... 


//Ball class 
... 

void Ball::spawnBall(cocos2d::Layer *layer){ 

ball = Sprite::create(); 
layer->addChild(ball); 
auto action = Sequence::create(MoveBy::create(...)), RemoveSelf::create(), null); 
ball->runAction(action); 

} 

我想拥有它的内存(堆)的控制,因为我发现用自动释放(栈):

Ball ball; 
    ball.spawnBall(this); 

某些球会随机停止。我想他们在产卵时覆盖了他们的记忆。

感谢

+0

你知道吗如果你创造e通过'create'方法,如果在完成使用之后调用'release',它会自动释放(通过'autorelease')(因为保留计数为0)? – PnotNP

+0

是的,我知道create()方法会自动发布。但我不确定这是否解决了我的问题。你能提供一个例子吗?谢谢 – ctapp1

回答

0

您的问题似乎是,你的堆栈变量是走出去的范围,如果runAction是异步调用:

int GameScene::func() 
{ 
Ball ball; 
ball.spawnBall(this); 
return 0; //ball is automatically deleted here 
} 

你应该能够

int GameScene::func() 
{ 
Ball *ball = Ball::create(); //dont use new here, use create() function here and autorelease 
ball.spawnBall(this); 
//autorelease here 
return 0; 
} 

我强烈推荐阅读Memory deallocation in Cocos2d-x

+0

我得到:释放对象的校验和不正确 - 对象可能在释放后被修改。仅供参考,我会反复调用这个函数来在屏幕上显示许多球。另外我使用的是void而不是int,所以我必须将它转换为(Ball *)Ball :: create(); – ctapp1

+0

谢谢你尝试 – ctapp1