2016-09-27 4 views
1

In meiner Spielszene spawne ich Bälle aus einer Ballklasse, die sich zufällig mit der MoveBy-Aktion bewegen. Meine Frage ist, wie gebe ich Ball frei, nachdem die MoveTo-Aktion beendet ist? Sehen Sie meinen Code unten:Neues Objekt nach Aktion freigeben

//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); 

} 

mag ich die Kontrolle über seinen Speicher (Heap) haben, weil ich mit einer automatischen Freigabe (Stack) gefunden:

Ball ball; 
    ball.spawnBall(this); 

Einige der Kugeln würden zufällig stoppen. Ich denke, sie überschreiben ihre Erinnerungen, wenn sie erzeugt werden.

Dank

+0

Wissen Sie, wenn Sie erstellen e es über 'create' Methode sollte es automatisch freigeben (über 'Autorelease'), wenn Sie 'Release' aufrufen, nachdem Sie fertig sind, es zu verwenden (weil Retain-Count auf 0 geht)? – PnotNP

+0

Ja, ich weiß, dass die Methode create() automatisch freigegeben wird. Aber ich bin mir nicht sicher, ob das mein Problem löst. Können Sie ein Beispiel geben? Danke – ctapp1

Antwort

0

Ihr Problem, dass Ihre Stapel Variable zu sein scheint ist außerhalb des Gültigkeitsbereichs gehen, wenn runAction asynchroner Aufruf ist:

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

Sie soll ich hoch zu

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

der Lage sein, empfehle das Lesen Memory deallocation in Cocos2d-x

+0

Ich bekomme: falsche Prüfsumme für freigegebenes Objekt - Objekt wurde wahrscheinlich nach dem Freigeben geändert. FYI ich rufe dieses func wiederholt auf, um viele Bälle auf dem Schirm anzuzeigen. Außerdem verwende ich eine void anstelle eines int, also musste ich es wie folgt eingeben: (Ball *) Ball :: create(); – ctapp1

+0

danke für den Versuch, obwohl – ctapp1

Verwandte Themen