我正在将我的V1 cocos2d-x应用更新为V3,而我却停留在回调上。
我可以用这样的lambdas回电,工作正常 -
auto mcb = CallFunc::create([this](){
this->doCallback(kEVENT_MENU_IS_ONSCREEN);
});
hex->runAction(Sequence::create(somethingthattakestime, mcb, NULL) );
但是,我想将一个CallFunc变量传递给一个函数,将它存储在我的对象中,然后在将来的某个时候使用/调用它。
在我定义的课程中 -
CallFunc * callfunc;
设置简单 -
item->callfunc = callfunc;
在一个函数中 -
void LBMenuAddMenuItemName( CallFunc * callfunc );
我还将CallFunc变量声明为静态,因此它会挂起 -
static auto doSoloPlay = CallFunc::create([this](){
CCLOG("doSoloPlay variable");
this->menuSoloPlay();
});
稍后当我想使用它时,我会 -
Sequence * seq = Sequence::create(callfunc,NULL);
somesprite->runAction(seq);
然而,这结束了SIGSEGV(GLThread)。
使用typeid(callfunc).name()显示callfunc是一个CallFunc。在声明中使用setTag(69),然后在SIGSEGV之前使用getTag()不返回合理的值。
有人可以解释我做错了什么以及延迟回调的正确方法吗?
谢谢!
LB
答案 0 :(得分:0)
尝试了很多事情然后发现当我在声明后执行'retain()'时这个错误消失了 -
doSoloPlay->retain();
这会增加引用次数。
我不知道为什么我需要这个。我的猜测是cocos2d-x类可以做一些聪明的垃圾收集吗?
答案 1 :(得分:0)
如果稍后将该函数作为回调调用,则需要在保存时保留回调并在适当的时间释放它。
静态声明只保存CCCallFunc的地址,但是在您希望执行它之前,类已被销毁。