サンプル
// NG
Node* nodeA;
Action* actionA = Sequence::create(...);
Node* nodeB;
Action* actionB = Sequence::create(...,
CallFunc::create[nodeA, actionA](){
nodeA->runAction(actionA);
}),
nullptr);
nodeB->runAction(actionB);
// OK
Node* nodeA;
Action* actionA = CallFunc::create([nodeA](){
nodeA->runAction(Sequence::create(...));
});
Node* nodeB;
Action* actionB = Sequence::create(..., actionA, nullptr);
nodeB->runAction(actionB);
解説
NGパターンでは、actionAがスコープを抜けたタイミングで、リリースされてしまうため、actionB内でいざ実行しようとした時には、存在が抹消されています。
別解
NGパターンのactionAを作ったタイミングで、
actionA->retain();
しておく方法もあるかと思いますが、releaseするタイミングが難しい気がしたので、未検証です。
(actionAが呼ばれてrunActionされた後であれば、確実に呼ばれるタイミングでreleaseしておけば大丈夫かも?)
いずれにせよ、メモリリークの危険を生まない方法で実装できるならそれに越したことがないと思います。まる。