scheduleOncede的大坑

    this->scheduleOnce(schedule_selector(HelloWorldScene::updateMsg), 60);

    this->scheduleOnce(std::bind(](float dt)
    {

    }, std::placeholders::_1), 0, Value(rand()).asString());


```


一次调用2次scheduleOnce,2次调用的回调函数是不同类型,会在第2次调用时,在CCScheduler.cpp:schedule   
if (key == timer->getKey())
```

处崩溃,因为第一次和第2次的Timer是不同的:TimerTargetSelector和TimerTargetCallback,而
TimerTargetCallback *timer = static_cast(element->timers->arr*);


```
会把TimerTargetSelector转为TimerTargetCallback,从而调用
if (key == timer->getKey())
```
造成崩溃!*

我现在只是调用 this->schedule(CC_CALLBACK1(Fun, this),“key”); 这么写的时候 再调用this->unscheduled(“key”),就会不定崩溃,有时候崩有时候不崩,崩溃位置就在 if (key == timer->getKey())
但是我用 this->schedule(schedule_selector(Fun)); 这种写法this->unschedule(schedule_selector(Fun)); 就没问题。。但是如果自定义update的函数参数就自定义传参不了,只能写成成员变量。

我记得 scheduleOnce 当时想做按钮长按的时候也崩溃(忘了是 取消的(unschedule)时候崩溃 还是 触发的时候崩溃了)

这些在3.3还是3.4的时候还是好用的。3.5之后就不行了,我也在论坛发过帖子,无人回复,直接给版主的邮箱反馈bug,倒是给我回复了一个正确用法。。。。。我回复我代码写得没问题后就再也不回复了

你这个还是我那个一样的原因!this->unscheduled(“key”),调用了Scheduler::unschedule(const std::string &key, void target),问题出在
TimerTargetCallback timer = static_cast<TimerTargetCallback>(element->timers->arr
);这个static_cast把基类性转换成子类型的时候没有安全检查,element->timers->arr里存的是2种Timer,TimerTargetSelector和TimerTargetCallback,崩溃的原因把TimerTargetSelector类型的指针转换为TimerTargetCallback类型的!有2种方法避免:
1:程序中调用的定时器统一类型
2:修改引擎CCScheduler.cpp代码,把所有TimerTargetCallback timer = static_cast<TimerTargetCallback>(element->timers->arr
);这类代码改成:TimerTargetCallback timer = dynamic_cast<TimerTargetCallback>(element->timers->arr*);然后if (key == timer->getKey())改成:if ( timer !=nullptr && key == timer->getKey())


1:程序中调用的定时器统一类型

这个是指什么呢?

我看明白你说的了,就是只能用bind或者是schedule_selector 或者这种, 之前还真没注意过,一直用的是bind的方式。。。。谢谢lz了

第一种是带key的,第二种是不带key 的,回调函数是类成员函数!

没错,以后用只用 scheduleOnce(schedule_selector,不敢用scheduleOnce(CC_CALLBACK_1了!!